次の方法で共有


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

更新 : 2007 年 11 月

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

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

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

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

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

機能プロバイダ

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

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

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

機能プロバイダの例

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

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

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

機能プロバイダ

説明

AdornerProvider

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

PrimarySelectionAdornerProvider

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

ContextMenuProvider

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

PrimarySelectionContextMenuProvider

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

PolicyDrivenFeatureConnector<FeatureProviderType>.ItemFeatureProvider

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

TaskProvider

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

PrimarySelectionTaskProvider

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

DesignModeValueProvider

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

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

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

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

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

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

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

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

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

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

機能プロバイダの例

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

機能コネクタ

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

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

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

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

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

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

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

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

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

参照

参照

AdornerProvider

EditingContext

FeatureManager

FeatureConnectorAttribute

その他の技術情報

WPF デザイナの機能拡張