다음을 통해 공유


WPF Designer 확장성 아키텍처

WPF Designer for Visual Studio는 WPF 및 Silverlight 요소를 시각적으로 편집할 수 있는 환경입니다. WPF Designer는 확장 가능한 아키텍처가 적용된 프레임워크에 기초를 두므로 사용자 지정 디자인 환경을 직접 만들어 확장할 수 있습니다.

WPF Designer 프레임워크를 확장하여 WPF 및 Silverlight 콘텐츠의 디자인 타임 모양과 동작을 크게 사용자 지정할 수 있습니다. 예를 들어 WPF Designer를 다음과 같은 방식으로 확장할 수 있습니다.

  • 이동 및 크기 조정 문자 모양을 사용자 지정하여 그래픽을 개선합니다.

  • 컨트롤의 상태를 변경하는 바로 가기 메뉴를 디자인 화면에 추가합니다.

  • 여러 도구 사이에서 컨트롤의 디자인 타임 모양 및 동작을 수정합니다.

WPF Designer 아키텍처는 WPF 및 Silverlight의 강력한 표현 능력을 완벽하게 지원합니다. 이를 통해 이전과는 차원이 다른 다양한 시각적 디자인 환경을 만들 수 있습니다.

WPF 및 Visual Studio에 대한 사용자 지정 디자인 타임 환경을 구현하는 방법의 예제를 보려면 연습: 디자인 타임 표시기 만들기를 참조하십시오. 

WPF 및 Silverlight를 위한 사용자 지정 디자인 환경을 만드는 방법을 보여 주는 샘플 코드는 WPF and Silverlight Designer Extensibility Samples 사이트를 참조하십시오.

WPF Designer 프레임워크

WPF Designer 프레임워크는 모듈식입니다. 즉, 디자인 타임을 확장할 때 해당 기능에 필요한 요소만 확장하게 됩니다. 따라서 사용자 지정 디자인 기능을 구현하기 위해 많은 양의 지원 코드를 작성할 필요가 없습니다.

이 개체 모델은 다음 표와 같은 다섯 가지 기능 단위로 구성됩니다.

기능 단위

설명

편집 모델

디자이너의 개체에 대한 프로그래밍 인터페이스입니다.

기능 공급자

디자이너 프레임워크의 주 확장성 지점입니다.

편집 컨텍스트

디자이너 상태에 대한 중앙 저장소입니다.

명령, 작업 및 도구

사용자 입력을 처리하는 명령, 작업 및 도구입니다.

디자인 타임 메타데이터

디자이너 논리를 런타임 논리와 물리적으로 구분하기 위한 컨트롤의 디자인 타임 동작이 들어 있는 어셈블리입니다.

다음 그림에서는 WPF Designer 프레임워크의 기능 단위를 보여 줍니다.

고수준 개체 모델

편집 모델

디자인 환경은 편집 모델이라는 프로그래밍 인터페이스를 통해 런타임 컨트롤과 상호 작용합니다. 편집 모델은 모델, 모델을 추상화하는 공용 래퍼 및 모델의 UI(사용자 인터페이스)를 나타내는 뷰라는 세 가지 하위 기능 단위로 구성됩니다.

디자인 환경에서는 ModelItem 형식을 사용하여 내부 모델과 통신합니다. 모든 변경 내용은 내부 모델에 영향을 주는 ModelItem 래퍼에 적용됩니다. 이를 통해 모델이 단순화됩니다. ModelItem 래퍼는 트랜잭션 지원, 실행 취소 추적 및 변경 알림 등의 복잡한 디자이너 기능을 처리합니다.

ModelService 클래스는 편집 모델 및 전역 이벤트 알림에 대한 진입점을 제공합니다.

ViewService 클래스는 시각적 표현을 내부 모델 항목에 매핑합니다.

디자이너가 작동하려면 두 서비스가 모두 필요합니다. 사용자 입력을 처리하여 명령에 전달하는 DesignerView 클래스는 이러한 두 클래스가 있어야 사용자 입력을 모델로 정확히 다시 매핑할 수 있습니다.

기능 공급자

FeatureProvider 또는 FeatureConnector<TFeatureProviderType> 클래스를 사용하여 형식의 디자인 타임 동작을 확장할 수 있습니다. FeatureConnector<TFeatureProviderType> 클래스는 FeatureProvider 개체의 목록을 관리합니다.

FeatureProvider 클래스는 가장 기본적인 확장성 지점을 제공합니다. 기능 공급자는 일반적으로 디자인 환경에 크게 구애받지 않으며 특정 컨텍스트에서 생성 및 소멸되는 간단한 기능 또는 추가 기능입니다. 기능 공급자는 디자인 화면에 새 UI를 추가하거나 일부 기본 동작을 수정하는 데 사용됩니다. 예를 들어 기능 공급자로 잡기 핸들을 더 추가하거나 새로운 마우스 끌기 동작을 제공할 수 있습니다.

가장 깊은 확장성 수준에 액세스하려면 FeatureConnector<TFeatureProviderType> 클래스에서 파생합니다. 이 클래스는 파생된 기능 커넥터 클래스에서 이벤트 및 요청을 처리하고 서비스를 게시하는 데 사용할 수 있는 서비스 공급자를 노출합니다. 예를 들어 선택 UI 또는 개체별 serialization을 제공하는 기능 커넥터를 구현할 수 있습니다.

일반적으로는 기존 개념을 확장하여 기능을 구현합니다. 반면 기능 커넥터를 구현하면 새로운 개념을 제공할 수 있습니다. 자세한 내용은 기능 공급자 및 기능 커넥터를 참조하십시오.

편집 컨텍스트

디자이너가 실행되는 동안 상당한 양의 상태 정보가 누적됩니다. 예를 들어 디자이너의 상태에는 현재 선택된 개체 또는 마우스 왼쪽 단추를 클릭할 때 발생하는 동작이 포함될 수 있습니다. 디자이너 상태는 중앙 위치에 저장되므로 필요한 경우 언제든지 검색할 수 있습니다. EditingContext 클래스는 디자이너 상태에 대한 이러한 중앙 리포지토리를 제공합니다.

EditingContext 클래스는 상태를 데이터와 동작이라는 두 가지 범주로 구분합니다. 데이터는 컨텍스트 항목의 테이블로 저장되고 동작은 서비스 테이블로 저장됩니다. 두 테이블은 형식 기반 키에 따라 인덱싱되며 열거 가능합니다.

ContextItem 클래스는 디자이너의 단일 상태를 보유합니다. 컨텍스트 항목은 변경할 수 없지만, 기존 컨텍스트 항목을 새 컨텍스트 항목으로 바꾸는 방법을 대신 사용할 수 있습니다.

ServiceManager의 인스턴스를 반환하는 Services 속성을 통해 서비스에 액세스할 수 있으며, ContextItemManager의 인스턴스를 반환하는 Items 속성을 통해 컨텍스트 항목에 액세스할 수 있습니다.

명령, 작업 및 도구

WPF Designer 도구 아키텍처는 명령, 작업 및 도구로 구성됩니다. 

명령은 몇 가지 동작을 나타내는 고유 식별자입니다. 예를 들어 잘라내기는 현재 텍스트를 잘라내 클립보드에 추가하는 명령입니다. 잘라내기를 구현하는 코드는 응용 프로그램마다 다르며, 같은 응용 프로그램 내에서도 다를 수 있습니다. 예를 들어 Word 문서에서 텍스트를 잘라내는 작업은 같은 문서의 텍스트 검색 상자에서 텍스트를 잘라내는 작업과 다르게 구현됩니다. 구현과 관계없이 잘라내기 명령은 일정하게 유지됩니다.

WPF Designer에서는 도구 명령이라는 개념을 도입하여 WPF 명령 시스템을 보완합니다. 도구 명령은 ICommand 인터페이스를 구현하며 RoutedCommand 클래스와 유사합니다.

작업에는 명령 바인딩의 컬렉션이 있으며, 이를 통해 라우트된 명령을 추가할 수 있습니다. DesignerView 클래스에는 도구 명령과 동일한 라우팅 전략을 사용하여 작업에 정의된 라우트된 명령을 찾아 실행하는 코드가 있습니다. DesignerView 클래스를 통해 Copy 등의 공통 WPF 명령을 지원하는 작업을 수행할 수 있습니다.

도구는 사용자 입력을 처리하는 클래스입니다. 모든 사용자 입력은 디자이너에 하나 이상의 입력 이벤트로 전달됩니다. 이러한 입력 이벤트는 현재 활성화된 도구에 전달되며, 이 도구는 입력 이벤트를 입력 바인딩으로 변환합니다. 입력 바인딩이 반환되면 바인딩 내의 명령이 실행됩니다.

도구는 디자이너의 전역 모드를 나타냅니다. 예를 들어 사용자가 디자인 화면에서 구성 요소를 선택하는 경우 현재 활성 도구가 선택을 처리하는 입력 바인딩과 명령을 제공하기 때문에 이러한 선택 모드를 사용할 수 있는 것입니다. 사용자가 컨트롤의 새 인스턴스를 만들면 다른 도구가 활성화되어 같은 입력 바인딩에 바인딩된 다른 명령 집합을 제공합니다.

디자인 타임 메타데이터

WPF Designer 프레임워크에서 컨트롤의 디자인 타임 동작을 정의하는 메타데이터는 특성으로 지정되며 별도의 어셈블리에 모여 있습니다. 각 디자이너마다 서로 다른 메타데이터 어셈블리(디자인 타임 구현이 완전히 다름)를 사용할 수 있습니다. 이를 통해 런타임 동작과 디자인 타임 동작이 분리되므로 디자이너를 컨트롤과 별개로 수정할 수 있습니다.

디자인 타임 구현을 제공하는 어셈블리를 지정하려면 ProvideMetadataAttribute를 사용하여 어셈블리를 표시하고 IProvideAttributeTable 인터페이스를 구현하는 클래스를 포함합니다.

자세한 내용은 디자인 타임 메타데이터 제공을 참조하십시오.

Expression Blend의 디자인 타임 지원

WPF Designer에서는 확장성 프레임워크의 모든 기능을 지원합니다. Expression Blend에서는 다음과 같은 기능을 지원합니다.

ParentAdapterPlacementAdapter는 Expression Blend에서 지원되지 않습니다.

WPF Designer 어셈블리

WPF Designer는 공용, 전용 및 디자이너 고유라는 세 가지 범주 중 하나에 속하는 몇 가지 어셈블리로 구성됩니다.

공용 어셈블리는 컨트롤에 디자인 타임 논리를 추가하는 데 사용할 수 있는 클래스를 노출합니다.

전용 및 디자이너 고유 어셈블리는 WPF Designer의 기능 집합 및 이러한 기능과 디자이너(예: Visual Studio 및 Expression Blend) 간의 상호 작용을 정의합니다.

WPF 및 Silverlight 디자이너는 단일 엔터티로 설치됩니다. 각 디자이너에 대한 별도의 패키지는 없습니다.

다음 표에서는 WPF Designer 기능이 배포되는 방식을 보여 줍니다.

어셈블리

공용 API

설명

Microsoft.Windows.Design.Extensibility.dll

특성 및 Visual Studio SDK 통합 논리를 통해 확장성 모델을 제공합니다.

Microsoft.Windows.Design.Interaction.dll

사용자 입력 및 표시 클래스를 제공합니다.

Microsoft.Windows.Design.Markup.dll

아니요

XAML 및 문서 모델 메커니즘을 제공합니다.

Microsoft.VisualStudio.Xaml.dll

아니요

서비스, 데이터 백플레인 및 메타데이터 조작을 통해 모든 디자이너의 XAML 기초를 제공합니다.

Microsoft.Windows.Design.Host.dll

아니요

디자이너 호스팅을 위한 전용 API(Visual Studio 고유)입니다.

Microsoft.Windows.Design.Developer.dll

아니요

WPF Designer 구현입니다.

Microsoft.Windows.Design.Developer.WPF.dll

아니요

Microsoft.Windows.Design.Developer.Silverlight.dll

아니요

Microsoft.Windows.Design.Platform.dll

아니요

추상 클래스가 포함된 플랫폼 레이어입니다. 이 어셈블리에서는 플랫폼 구현을 통해 추상 클래스가 구현됩니다.

Microsoft.Windows.Design.Platform.WPF.dll

아니요

WPF용 플랫폼 고유 디자인 타임입니다.

Microsoft.Windows.Design.Platform.Silverlight.dll

아니요

Silverlight용 플랫폼 고유 디자인 타임입니다.

Microsoft.Expression.DesignModel.dll

아니요

Expression Blend 디자인 타임 어셈블리입니다.

Microsoft.Expression.Platform.WPF.dll

아니요

Expression Blend 디자인 타임 어셈블리입니다.

Microsoft.Expression.Platform.Silverlight.dll

아니요

Expression Blend 디자인 타임 어셈블리입니다.

참고

어셈블리는 네임스페이스 경계가 아닌 기능 경계를 나타냅니다. 네임스페이스가 둘 이상의 어셈블리에 걸쳐 있는 경우도 있습니다.

WPF Designer와 Windows Forms 디자이너 아키텍처

WPF Designer 아키텍처는 IComponent 인터페이스 및 System.ComponentModel 네임스페이스로 규정되는 Windows Forms 디자이너 아키텍처와 크게 다릅니다. 자세한 내용은 Windows Forms 디자이너 프레임워크와 WPF Designer 프레임워크 비교를 참조하십시오.

참고 항목

개념

기능 공급자 및 기능 커넥터

기타 리소스

디자인 타임 메타데이터 제공

디자인할 때 Windows Forms 컨트롤 개발

WPF Designer 확장성