次の方法で共有


機能プロバイダーと機能コネクタ

Windows Presentation Foundation (WPF) アプリケーションまたは Silverlight アプリケーション内のデザイン可能なオブジェクトは、任意の数のデザイナー拡張機能を公開できます。 次のトピックでは、機能プロバイダーの働きと、デザイン時機能を提供するうえでの機能コネクタの役割について説明します。

機能プロバイダーと機能コネクタの基本

機能プロバイダーは、オブジェクトに追加のデザイン時機能を提供する軽量の型です。 サブコンポーネントに関する情報を提供するだけで、デザイナーに代わって操作を要求することのない機能プロバイダーもあります。 一方、オブジェクトのデザイナー コンテキスト メニューへのメニュー項目の追加、サイズ変更や編集用のカスタム装飾の作成、またはデザイナー上のオブジェクトのドラッグ アンド ドロップの再定義を行う機能プロバイダーもあります。

機能プロバイダーは、FeatureProvider クラスから直接派生することによって、または、AdornerProviderContextMenuProvider などのように、それ自体が FeatureProvider から派生しているクラスから派生することによって、実装されます。 機能プロバイダーは軽量となるように設計されており、インスタンス間の状態を保存しません。

機能コネクタは、特定のオブジェクトの 1 つ以上の機能プロバイダーを管理します。 機能コネクタは、サービス プロバイダーを通じて新しいサービスを発行し、選択項目の変更などのデザイナー イベントをリッスンします。 機能コネクタは、FeatureConnector<TFeatureProviderType> クラスまたは PolicyDrivenFeatureConnector<TFeatureProviderType> クラスから新しいクラスを派生することによって実装されます。

機能プロバイダー

機能プロバイダーは、軽量な機能拡張を目的としています。 デザイナー機能拡張に関係する一般的なシナリオでは、新しい機能コネクタの作成ではなく、既存の機能プロバイダー クラスからの派生が優先されます。 機能プロバイダーは、状態を保存できません。状態の作成と破棄が複数回にわたって行われるためです。

機能プロバイダーは機能コネクタによって完全に管理され、メタデータ (特に FeatureAttribute) を介してオブジェクトと関連付けられます。 機能コネクタは、このメタデータから FeatureProvider 型を検出します。 FeatureManager クラスは、検出されたすべての機能プロバイダーに対して必要な機能コネクタを識別します。

一般的な機能プロバイダーの実装には、選択装飾、動詞、およびプロパティ エディターが含まれます。 詳細については、「チュートリアル : デザイン時装飾の作成」を参照してください。

機能プロバイダーの例

次の図は、ビジュアルなデザイナーと、機能プロバイダーまたは機能コネクタに分類される機能の種類を示しています。 この図は、デザイナーの一部の機能の実装方法を例示しているに過ぎません。

機能プロバイダーとコネクタの例

派生元の機能プロバイダーを次の表に示します。

機能プロバイダー

説明

AdornerProvider

デザイナー画面に装飾を追加します。

PrimarySelectionAdornerProvider

主要な選択に対して表示される装飾を追加します。

ContextMenuProvider

コンテキスト メニューに表示されるメニュー項目のセットを定義します。

PrimarySelectionContextMenuProvider

現在の選択に対して表示されるメニュー項目のセットを定義します。

PolicyDrivenFeatureConnector<TFeatureProviderType>.ItemFeatureProvider

特定の項目に属す機能プロバイダーを識別します。

TaskProvider

アクティブなツールにタスクを追加します。

PrimarySelectionTaskProvider

クラスが主要選択に含まれている場合に、選択ツールから使用できるタスクのセットを提供します。

DesignModeValueProvider

デザイナーでユーザーが行ったプロパティの変更をキャプチャし、デザイン時に新しい値を提供します。

デザイン時に機能プロバイダーを作成する方法

多くの場合、独自のカスタム機能コネクタを作成する必要はありません。 機能プロバイダーを作成し、FeatureConnectorAttribute を使用してこの機能プロバイダーをクラスに直接関連付けることができます。 FeatureManager クラスは、機能プロバイダーをアクティブにする WPF デザイナーのコンポーネントです。 FeatureManager デザイン サーフェイスにオブジェクトが配置されると同時に、そのメタデータを調べます。 オブジェクトの FeatureConnectorAttribute が見つかると、関連付けられている機能プロバイダーが作成されます。

たとえば、デザイナー画面上でカスタム コントロールのヘッダー テキストを直接編集できるようにする装飾を作成する場合、この装飾は、PrimarySelectionAdornerProvider (これ自体は FeatureProvider から派生) から派生させることによって実装します。 次に、FeatureConnectorAttribute を使用して、カスタム装飾をコントロールに関連付けます。

機能プロバイダーと型の関連付け

デザイン時ツールは、メタデータ属性を介して、機能プロバイダーを型に関連付けます。 メタデータを実際の実行時オブジェクトまたはインスタンスにバインドするには、それを宣言する必要があります。 このバインディングはツール レベルで必要であり、デザイン時フレームワークでは行われません。 デザイン時ツールが機能プロバイダーをさまざまな型に関連付ける方法を次の図に示します。

機能プロバイダーと型の関連付け

WPF デザイナー アーキテクチャで機能プロバイダーを型に関連付ける方法には 2 種類あります。それは、FeatureAttribute 型と FeatureConnectorAttribute 型です。 FeatureProvider 型は、編集可能なオブジェクトの型またはインスタンスで使用され、FeatureAttribute を表すプロパティを公開します。

FeatureConnectorAttributeFeatureProvider クラスを装飾し、指定された機能プロバイダーをホストするために必要な機能コネクタの型を示します。 FeatureManager クラスは、渡されたオブジェクトが変更されると、必要な FeatureConnector<TFeatureProviderType> インスタンスを作成します。

編集可能なオブジェクトが UIElement 型である、WPF 固有のデザイナーを例に挙げます。 このようなツールでは、1 つまたは複数の "グラブ ハンドル" を使用して、個々の項目の境界を装飾します。 これらの装飾は、選択項目をビジュアルに表現し、編集可能なこれらのオブジェクトを操作します。 デザイナーは、メタデータを使用して、グラブ ハンドル機能を UIElement 型のすべてのオブジェクトに関連付けます。 次の図は、デザイナーが、デザイン サーフェイス上の UIElement にグラブ ハンドル プロバイダーを関連付ける方法を示しています。

機能プロバイダーの例

UIElement が存在し、機能マネージャーに渡されて分析されると、UIElement に関連付けられているメタデータを介して、GrabHandleProvider が検出されます。 GrabHandleProvider 型自体、またはその基本型がメタデータを介して調べられ、必要な機能コネクタが特定されます。

機能コネクタ

機能コネクタは、このアーキテクチャで公開される最も低いレベルの機能拡張です。 機能コネクタは、EditingContext への参照が指定されて作成されます。 機能コネクタは、グローバル サービスをサブスクライブでき、独自のサービスを追加できます。 抽象 FeatureConnector<TFeatureProviderType> クラスは、単純なクリーンアップ処理を行う IDisposable インターフェイスを実装します。

機能コネクタは要求に応じて作成されます。 FeatureManagerFeatureProviderFeatureConnectorAttribute を検出したときに、その型がまだ存在していない場合、機能マネージャーは指定された FeatureConnector<TFeatureProviderType> を作成します。 機能コネクタは、これらが検出されたときにのみ作成されます。デザイナー セッションが起動時に既定のセットを作成するわけではありません。 FeatureProvider に複数の FeatureConnectorAttribute 型がある場合は、すべての機能コネクタが初期化されます。 このため、サードパーティは、既存の FeatureProvider から派生し、カスタム機能コネクタを追加し、両方の機能セットを初期化できます。

FeatureConnector<TFeatureProviderType> クラスの機能のほとんどは、プロテクト CreateFeatureProviders メソッドで実装されます。 オブジェクトがこのメソッドに渡されると、機能コネクタは、そのオブジェクトの FeatureAttribute 型を探します。 これらの属性が見つかると、この属性に関連付けられた FeatureProvider インスタンスが作成され、リストで返されます。

FeatureConnector<TFeatureProviderType> 基本クラスはジェネリックであり、FeatureConnector<TFeatureProviderType> がホストする機能プロバイダーの型を使用します。 機能プロバイダーは FeatureConnectorAttribute を使用して、関連付けられた機能コネクタを指定します。 FeatureConnector<TFeatureProviderType> の保護された基本クラス メソッド、特に CreateFeatureProviders メソッドは、派生クラスのキャストやタイプ セーフを考慮することなく、機能プロバイダーの型指定されたコレクションを、派生された機能コネクタに返すことができます。

カスタム機能コネクタの作成

選択項目などのデザイナー イベントをリッスンする場合は、独自の機能コネクタを作成する必要があります。 カスタム デザイナー ロジックは、FeatureConnector<TFeatureProviderType> クラスまたは PolicyDrivenFeatureConnector<TFeatureProviderType> クラスから派生させて実装します。

機能コネクタにはデザイナーのグローバル EditingContext への参照が提供され、機能コネクタはそれを通じてデザイナー サービスにアクセスしたり、独自のカスタム サービスを発行したりできます。 たとえば、チャート コントロール ベンダーは、デザイナー内のカスタム型エディターで、現在チャート上にあるすべてのウィジェットを列挙するサービスを発行できます。

FeatureConnector<TFeatureProviderType> から派生するクラスを作成したら、機能プロバイダーに FeatureConnectorAttribute を適用することによって、そのクラスを機能プロバイダーに関連付けることができます。 その機能プロバイダーのインスタンスが作成されるたびに、FeatureManager は、FeatureConnectorAttribute のメタデータを調べます。 属性が定義されており、関連付けられている FeatureConnector<TFeatureProviderType> のインスタンスが現在実行していない場合は、FeatureManager によってインスタンスが作成され、その機能プロバイダーの今後のすべてのインスタンスが、FeatureConnector<TFeatureProviderType> に関連付けられます。

機能コネクタの実装方法を示すコード例については、「方法 : カスタム機能コネクタを作成する」を参照してください。

参照

参照

AdornerProvider

EditingContext

FeatureManager

FeatureConnectorAttribute

その他の技術情報

WPF デザイナーの機能拡張