다음을 통해 공유


WPF Designer 확장성 아키텍처

업데이트: 2007년 11월

Windows Presentation Foundation(WPF) Designer for Visual Studio는 UserControl 형식으로 구현되는 WPF 합성 컨트롤을 위한 시각적 편집 환경입니다. WPF Designer는 확장 가능한 아키텍처가 적용된 프레임워크에 기초를 두므로 사용자 지정 디자인 환경을 직접 만들어 확장할 수 있습니다.

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

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

  • 디자인 화면에 마우스 움직임에 따라 선택한 컨트롤을 기울이는 문자 모양을 추가합니다.

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

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

WPF Designer 개체 모델

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

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

기능 단위

설명

편집 모델

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

기능 공급자

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

편집 컨텍스트

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

도구

사용자 입력을 처리하는 도구입니다.

메타데이터 저장소

디자이너 논리와 런타임 논리를 실제로 구분하는 컨트롤의 디자인 타임 동작이 들어 있는 저장소입니다.

다음 그림에서는 WPF Designer 개체 모델을 보여 줍니다.

고수준 개체 모델

참고:

WPF Designer에서는 전체 확장성 프레임워크를 지원합니다. Expression Blend에서는 속성 편집기, 메타데이터 로드 및 라이선스만 지원합니다. Blend는 메뉴 작업 및 표시기(adorner)를 지원하지 않습니다.

편집 모델

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

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

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

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

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

기능 공급자

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

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

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

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

편집 컨텍스트

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

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

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

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

명령, 작업 및 도구

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

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

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

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

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

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

메타데이터 저장소

WPF Designer 프레임워크에서 컨트롤의 디자인 타임 동작을 정의하는 메타데이터는 메타데이터 저장소라는 별도의 어셈블리에 모여 있습니다. .NET Framework 3.5에서는 메타데이터 저장소가 코드 기반 특성 테이블로 구현되며 디자이너 코드 및 프로필을 참조하는 외부 XML 파일이 사용됩니다. 다른 도구에서는 완전히 다른 디자이너 구현을 사용하여 별도의 메타데이터 저장소를 제공할 수 있습니다. 이를 통해 런타임 동작과 디자인 타임 동작이 분리되므로 디자이너를 컨트롤과 별개로 수정할 수 있습니다. 자세한 내용은 메타데이터 저장소를 참조하십시오.

디자이너 인스턴스 만들기

다음 단계에서는 WPF Designer 환경에서 예제 디자이너 형식을 인스턴스화하는 방법을 보여 줍니다. 이 가상 예제를 통해 디자이너가 디자인 화면에서 단추 컨트롤 하나를 선택하는 방법을 확인할 수 있습니다.

  1. 사용자가 사용자 지정 디자이너 생성을 요청하는 도구 정의 작업을 호출합니다.

  2. 디자인 환경에서 기능과 형식을 연결하는 XML 기반 목록을 열거합니다.

  3. 디자인 환경에서 TypeDescriptor 클래스를 사용하여 이러한 형식에 사용자 지정 메타데이터를 추가합니다. 예를 들어 GrabHandleProvider를 파생 형식을 포함한 모든 UIElement 형식에 연결할 수 있습니다.

  4. 편집 팩터리에서 편집 저장소, 컨텍스트 및 기능 관리자를 만들고 편집 저장소를 채웁니다.

  5. WPF Designer에서 편집 저장소가 노출하는 모든 UIElement 개체를 열거하고 각 개체에 대해 InitializeFeatures 메서드를 호출합니다.

    1. 이 계층 구조에 Button 요소가 선언되어 있다고 가정합니다.

    2. FeatureManager에서 단추의 FeatureAttribute를 검색합니다. FeatureManager가 GrabHandleProvider 형식의 단추에서 FeatureAttribute를 발견합니다.

    3. FeatureManager에서 GrabHandleProvider 형식을 계속 검색하여 여기에 연결된 FeatureConnectorAttribute를 발견합니다. FeatureConnectorAttribute는 SelectionConnector를 지정합니다.

    4. FeatureManager에서 이 호스트가 아직 없음을 확인합니다. FeatureManager에서 SelectionConnector를 만들어 활성 기능 호스트 목록에 추가합니다.

    5. SelectionConnector 개체가 디자인 화면에서 선택 항목이 변경되는지 모니터링하기 시작합니다. 또한 SelectionConnector 개체에서 표시기(Adorner) 계층에 대한 참조를 가져옵니다.

  6. 사용자가 단추에 대한 선택 항목을 변경하면 디자인 타임 도구에서 선택 변경 이벤트가 발생합니다.

  7. SelectionConnector에서 이 알림을 받아 선택된 개체에 연결된 GrabHandleProvider 인스턴스를 비롯한 모든 선택 기반 FeatureProvider 인스턴스를 만듭니다.

  8. SelectionConnector에서 GrabHandleProvider에 표시기 목록을 쿼리하고 이 표시기 목록을 표시기 계층에 추가합니다. 선택된 단추 주위에 잡기 핸들이 나타납니다.

WPF Designer 어셈블리

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

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

전용 및 Visual Studio 고유 어셈블리는 WPF Designer의 기능 집합 및 이러한 기능과 Visual Studio 간의 상호 작용을 정의합니다. 다음 표에서는 WPF Designer 기능이 배포되는 방식을 보여 줍니다.

어셈블리

공용 API

설명

Microsoft.VisualStudio.Xaml.dll

아니요

Visual Studio SDK 통합 논리입니다.

Microsoft.Windows.Design.Host.dll

호스팅하는 디자이너를 위한 공용 API(Visual Studio 고유)입니다.

Microsoft.Windows.Design.Developer.dll

아니요

WPF Designer 구현이며, 공용 API만 특성 테이블입니다.

Microsoft.Windows.Design.Core.dll

서비스, 데이터 백플레인 및 메타데이터 조작을 통해 모든 디자이너의 기초를 제공합니다. Expression Blend에서는 이 어셈블리만 지원합니다.

Microsoft.Windows.Design.Extensibility.dll

특성을 통해 확장성 모델을 제공합니다.

Microsoft.Windows.Design.Interaction.dll

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

Microsoft.Windows.Design.Markup.dll

XAML(Extensible Application Markup Language) 및 문서 모델 메커니즘을 제공합니다.

참고:

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

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

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

참고 항목

개념

기능 공급자 및 기능 커넥터

기타 리소스

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

WPF Designer 확장성