기능 공급자 및 기능 커넥터
WPF(Windows Presentation Foundation) 또는 Silverlight 응용 프로그램의 모든 디자인 가능 개체는 임의 개수의 디자이너 확장을 노출할 수 있습니다. 다음 항목에서는 기능 공급자의 기능과 디자인 타임 기능 제공 시의 기능 커넥터 역할에 대해 설명합니다.
기능 공급자 및 기능 커넥터의 기본 사항
기능 공급자는 개체에 대한 추가 디자인 타임 기능을 제공하는 간단한 형식입니다. 일부 기능 공급자는 하위 구성 요소에 대한 정보만 제공할 수도 있으며 디자이너 대신 작업을 수행할 필요가 없습니다. 다른 기능 공급자는 개체 디자이너의 상황에 맞는 메뉴에 메뉴 항목을 추가하거나, 크기 조정 또는 편집을 위한 사용자 지정 표시기(Adorner)를 만들거나, 디자이너의 개체 끌어서 놓기를 다시 정의할 수도 있습니다.
기능 공급자는 FeatureProvider 클래스에서 직접 파생되거나 FeatureProvider에서 파생된 클래스(예: AdornerProvider 및 ContextMenuProvider)에서 파생되어 구현됩니다. 기능 공급자는 간단하게 디자인되었으며 인스턴스 간에 상태를 저장하지 않습니다.
기능 커넥터는 지정된 개체에 대한 하나 이상의 기능 공급자를 관리합니다. 기능 커넥터는 서비스 공급자를 통해 새 서비스를 게시하고 선택 변경과 같은 디자이너 이벤트를 수신 대기할 수 있습니다. 기능 커넥터는 FeatureConnector<TFeatureProviderType> 또는 PolicyDrivenFeatureConnector<TFeatureProviderType> 클래스에서 새 클래스를 파생시켜 구현됩니다.
기능 공급자
기능 공급자는 확장할 수 있는 간단한 시작점이 되도록 디자인되었습니다. 디자이너 확장성과 관련된 일반 시나리오에서는 새 기능 커넥터를 만드는 대신 기존의 기능 공급자 클래스에서 파생시키는 방법을 선호합니다. 기능 공급자는 여러 번 만들어지고 삭제되므로 상태를 저장하면 안 됩니다.
기능 공급자는 전적으로 기능 커넥터에 의해 관리되며 메타데이터, 특히 FeatureAttribute를 통해 개체에 연결됩니다. 기능 커넥터는 이 메타데이터에서 FeatureProvider 형식을 검색합니다. FeatureManager 클래스는 검색된 각 기능 공급자에 필요한 기능 커넥터를 식별합니다.
공용 기능 공급자 구현에는 선택 표시기, 동사 및 속성 편집기가 포함됩니다. 자세한 내용은 연습: 디자인 타임 표시기 만들기를 참조하십시오.
기능 공급자 예제
다음 그림에서는 비주얼 디자이너와 기능 공급자 또는 기능 커넥터 범주에 해당할 수 있는 기능 형식을 보여 줍니다. 이 그림은 디자이너의 일부 기능을 구현할 수 있는 방법의 예제일 뿐입니다.
다음 표에서는 파생시킬 수 있는 기능 공급자를 보여 줍니다.
기능 공급자 |
설명 |
---|---|
디자이너 화면에 표시기를 추가합니다. |
|
기본 선택에 대해 표시되는 표시기를 추가합니다. |
|
상황에 맞는 메뉴에 표시되는 메뉴 항목 집합을 정의합니다. |
|
현재 선택에 대해 표시되는 메뉴 항목 집합을 정의합니다. |
|
PolicyDrivenFeatureConnector<TFeatureProviderType>.ItemFeatureProvider |
특정 항목에 속하는 기능 공급자를 식별합니다. |
활성 도구에 작업을 추가합니다. |
|
클래스가 기본 선택 내용에 있을 때 선택 도구에서 사용 가능한 작업 집합을 제공합니다. |
|
디자이너에서 사용자가 수행한 속성 변경을 캡처하고 디자인 타임에 새 값을 제공합니다. |
디자인 타임에 기능 공급자를 만드는 방법
대체로 고유한 사용자 지정 기능 커넥터를 만들 필요는 없습니다. 기능 공급자를 만들고 FeatureConnectorAttribute를 사용하여 직접 클래스와 연결할 수 있습니다. FeatureManager 클래스는 기능 공급자를 활성화하는 WPF Designer의 구성 요소입니다. FeatureManager는 개체가 디자인 화면에 배치되면 곧바로 개체의 메타데이터를 검사합니다. 개체에 대한 FeatureConnectorAttribute를 찾으면 관련된 기능 공급자를 만듭니다.
예를 들어 디자이너 화면에서 직접 사용자 지정 컨트롤의 머리글 텍스트를 편집할 수 있게 하는 표시기를 만들려면 FeatureProvider에서 파생된 PrimarySelectionAdornerProvider에서 파생시켜 표시기를 구현합니다. 그런 다음 FeatureConnectorAttribute를 사용하여 사용자 지정 표시기를 컨트롤과 연결합니다.
기능 공급자와 형식 연결
디자인 타임 도구는 메타데이터 특성을 통해 기능 공급자를 형식에 연결합니다. 메타데이터를 실제 런타임 개체 또는 인스턴스에 바인딩하는 선언적 방법이 있어야 합니다. 이 바인딩은 도구 수준에서 필요하며 디자인 타임 프레임워크에서 수행되지 않습니다. 다음 그림에서는 디자인 타임 도구가 기능 공급자를 다른 형식에 연결하는 방법을 보여 줍니다.
WPF Designer 아키텍처에서 기능 공급자를 형식과 연결하는 방법에는 FeatureAttribute 및 FeatureConnectorAttribute 형식 두 가지가 있습니다. FeatureAttribute 형식은 편집 가능한 개체의 형식 또는 인스턴스에서 사용되며 FeatureProvider를 나타내는 속성을 노출합니다.
FeatureConnectorAttribute는 FeatureProvider 클래스를 데코레이팅하며 지정한 기능 공급자를 호스팅하는 데 필요한 기능 커넥터 형식을 나타냅니다. FeatureManager 클래스로 전달되는 개체를 변경하면 이 클래스에서 필요한 FeatureConnector<TFeatureProviderType> 인스턴스를 만듭니다.
편집 가능한 개체가 UIElement 형식인 WPF 관련 디자이너를 고려해 보십시오. 이러한 도구는 하나 이상의 "잡기 핸들"을 사용하여 개별 항목의 경계를 표시할 수 있습니다. 이 표시기는 선택 내용을 시각적으로 나타내며 편집 가능한 개체의 조작을 가능하게 합니다. 디자이너는 메타데이터를 통해 잡기 핸들 기능을 UIElement 형식의 모든 개체에 연결합니다. 다음 그림에서는 디자이너가 디자인 화면에서 잡기 핸들 공급자를 UIElement에 연결하는 방법을 보여 줍니다.
UIElement가 있고 분석을 위해 기능 관리자로 전달되면 UIElement와 관련된 메타데이터를 통해 GrabHandleProvider를 찾습니다. 필요한 기능 커넥터를 확인하기 위해 GrabHandleProvider 형식 자체나 해당 기본 형식이 메타데이터를 통해 검사됩니다.
기능 커넥터
기능 커넥터는 이 아키텍처에서 노출되는 확장성의 최하위 수준입니다. EditingContext에 대한 참조가 있으면 기능 커넥터가 만들어집니다. 기능 커넥터는 전역 서비스에 등록하거나 자체 서비스를 추가할 수 있습니다. 추상 FeatureConnector<TFeatureProviderType> 클래스는 단순한 정리 전략을 사용하는 IDisposable 인터페이스를 구현합니다.
기능 커넥터는 요청 시 만들어집니다. FeatureManager가 FeatureProvider에서 FeatureConnectorAttribute를 찾은 경우 지정된 FeatureConnector<TFeatureProviderType> 형식이 없으면 이를 만듭니다. 기능 커넥터는 발견된 경우에만 만들어지며 디자이너 세션에서 시작 시 기본 집합을 만들지는 않습니다. FeatureProvider에 대한 FeatureConnectorAttribute 형식이 둘 이상 있으면 모든 기능 커넥터가 초기화됩니다. 따라서 타사는 기존 FeatureProvider에서 파생시키고 사용자 지정 기능 커넥터를 추가하여 두 기능 집합이 모두 초기화되게 할 수 있습니다.
FeatureConnector<TFeatureProviderType> 클래스의 기능 중 대부분은 보호된 CreateFeatureProviders 메서드에서 구현됩니다. 이 메서드에 개체를 전달하면 기능 커넥터에서 개체의 FeatureAttribute 형식을 찾습니다. 이러한 특성이 발견되면 각 특성에 연결된 FeatureProvider 인스턴스가 만들어지고 목록으로 반환됩니다.
FeatureConnector<TFeatureProviderType> 기본 클래스는 제네릭이며, FeatureConnector<TFeatureProviderType>에서 호스팅하는 기능 공급자의 형식을 사용합니다. 기능 공급자는 FeatureConnectorAttribute를 사용하여 연결된 기능 커넥터를 나타냅니다. FeatureConnector<TFeatureProviderType>의 보호된 기본 클래스 메서드(주로 CreateFeatureProviders 메서드)는 파생 클래스의 캐스팅 및 형식 안전에 대해 염려하지 않고 형식화된 기능 공급자 컬렉션을 파생된 기능 커넥터로 반환할 수 있습니다.
사용자 지정 기능 커넥터 만들기
선택 등의 디자이너 이벤트를 수신 대기하려면 고유한 기능 커넥터를 만들어야 합니다. FeatureConnector<TFeatureProviderType> 또는 PolicyDrivenFeatureConnector<TFeatureProviderType> 클래스에서 파생시켜 사용자 지정 디자이너 논리를 구현합니다.
기능 커넥터에 디자이너의 전역 EditingContext에 대한 참조가 제공되며, 기능 커넥터는 이를 통해 디자이너 서비스에 액세스하고 고유한 사용자 지정 서비스를 게시할 수 있습니다. 예를 들어 Chart 컨트롤 공급업체는 디자이너의 사용자 지정 형식 편집기에서 현재 차트에 있는 모든 widget을 열거할 수 있게 하는 서비스를 게시할 수 있습니다.
FeatureConnector<TFeatureProviderType>에서 파생된 클래스를 만든 경우 기능 공급자에 FeatureConnectorAttribute를 적용하여 이 클래스를 기능 공급자에 연결할 수 있습니다. 해당 기능 공급자의 인스턴스가 만들어질 때마다 FeatureManager는 FeatureConnectorAttribute에 대한 메타데이터를 검사합니다. 특성이 정의되어 있고 관련된 FeatureConnector<TFeatureProviderType>의 인스턴스가 현재 실행되고 있지 않으면 FeatureManager는 이 인스턴스를 만들고 해당 기능 공급자의 모든 이후 인스턴스를 FeatureConnector<TFeatureProviderType>와 연결합니다.
기능 커넥터를 구현하는 방법을 보여 주는 예제 코드는 방법: 사용자 지정 기능 커넥터 만들기를 참조하십시오.