デザイナーの初期化とメタデータの構成

デザイナーまたはデザイナー コンポーネントに関連付けられているメタデータ属性およびフィルター属性を操作すると、さまざまな Type オブジェクト (データ構造、クラス、グラフィカル エンティティなど) を扱うために特定のデザイナーで使用されるツール、デザイナーを利用できるタイミング、デザイナーをサポートするための Visual Studio IDE の構成 (使用可能なツールボックス カテゴリまたはタブなど) を定義するためのメカニズムがアプリケーションにもたらされます。

Visual Studio SDK には、VSPackage によるデザイナーまたはデザイナー コンポーネントの初期化の制御とそのメタデータの操作を容易にする複数のメカニズムが用意されています。

メタデータと構成情報を初期化する

これらはオンデマンドで読み込まれるので、デザイナーのインストール前に、Visual Studio 環境で VSPackage が読み込まれていない可能性があります。 このため、VSPackage では、作成時にデザイナーまたはデザイナー コンポーネントを構成するための標準的なメカニズム (DesignerCreated イベントを処理するためのもの) は使用できません。 代わりに、VSPackage では、DesignSurfaceExtension インターフェイスのインスタンスを実装し、カスタマイズを提供するために自らを登録します。これをデザイン サーフェイス拡張機能と呼びます。

初期化をカスタマイズする

デザイナー、コンポーネント、またはデザイナー サーフェイスのカスタマイズには次の操作が含まれます。

  1. デザイナー メタデータの変更と、特定の Type にアクセスしたり変換したりする方法の効果的な変更。

    これは通常は UITypeEditor または TypeConverter のメカニズムを通じて行われます。

    たとえば、System.Windows.Forms ベースのデザイナーが初期化されるときに、Visual Studio 環境では、ファイル システムではなくビットマップを取得するためにリソース マネージャーを使用するデザイナーで使用される Image オブジェクトの UITypeEditor を変更します。

  2. イベントのサブスクライブやプロジェクト構成情報の取得などによる環境との統合。 ITypeResolutionService インターフェイスを取得すると、プロジェクト構成情報を取得し、イベントをサブスクライブできます。

  3. 適切なツールボックス カテゴリのアクティブ化や、ToolboxItemFilterAttribute クラスのインスタンスのデザイナーへの適用を通じたデザイナーの適用性の制限によるユーザー環境の変更。

VSPackage によるデザイナーの初期化

VSPackage では、次の操作を行って、デザイナーの初期化を処理する必要があります。

  1. DesignSurfaceExtension クラスを実装するオブジェクトの作成。

    Note

    DesignSurfaceExtension クラスは決して、Package クラスと同じオブジェクト上に実装しないでください。

  2. VSPackage のデザイナー拡張機能のサポートの提供として DesignSurfaceExtension を実装するクラスの登録。 VSPackage による Package の実装を提供するクラスに、DesignSurfaceExtensionAttributeProvideObjectAttributeProvideServiceAttribute のインスタンスを適用して、クラスを登録します。

デザイナーまたはデザイナー コンポーネントを作成するたびに、Visual Studio 環境では次のように処理します。

  • 登録したそれぞれのデザイン サーフェイス拡張機能プロバイダーにアクセスします。

  • それぞれのデザイン サーフェイス拡張機能プロバイダーの DesignSurfaceExtension オブジェクトのインスタンスを作成し初期化します。

  • 各デザイン サーフェイス拡張機能プロバイダーの OnDesignerCreated メソッドまたは OnComponentCreated メソッド (必要に応じて) を呼び出します。

DesignSurfaceExtension オブジェクトを VSPackage のメンバーとして実装するときに、次の点を把握することが重要です。

  • Visual Studio 環境では、特定の DesignSurfaceExtension プロバイダーが変更したメタデータや他の構成設定について一切制御しません。 2 つ以上の DesignSurfaceExtension プロバイダーが同じデザイナー機能を相反する方法で変更し、最後の変更が決定版になるということはありえます。 どの変更が最後に適用されるかは、不確定です。

  • DesignSurfaceExtension オブジェクトの実装を特定のデザイナーに明示的に制限するには、その実装に ToolboxItemFilterAttribute のインスタンスを適用します。 ツールボックス項目のフィルター処理の詳細については、「ToolboxItemFilterAttribute」および「ToolboxItemFilterType」を参照してください。

追加メタデータのプロビジョニング

VSPackage では、デザイン時以外にデザイナーまたはデザイナー コンポーネントの構成を変更できます。

ProvideDesignerMetadataAttribute クラスはプログラムで使用することも、デザイナーを提供する VSPackage に適用することもできます。

ProvideDesignerMetadataAttribute クラスのインスタンスは、デザイン サーフェイスで作成されたコンポーネントのメタデータを変更するために使用されます。 たとえば、CommonDialog オブジェクトで使用される既定のプロパティ ブラウザーは、カスタム プロパティ ブラウザーに置き換えることができます。

VSPackage による Package の実装に適用される ProvideDesignerMetadataAttribute のインスタンスでもたらされる変更では、次の 2 つのスコープのどちらかを使用できます。

  • グローバル -- 指定のコンポーネントのすべての新しいインスタンス用

  • ローカル -- 現在の VSPackage で提供されるデザイン サーフェイス上に作成されたコンポーネントのインスタンスにのみ関連。

VSPackage による Package の実装に適用された ProvideDesignerMetadataAttribute インスタンスの IsGlobal プロパティによって、このスコープが決定します。

次に示すように、true に設定されている ProvideDesignerMetadataAttribute オブジェクトの IsGlobal プロパティを使用して Package の実装に属性を適用すると、Visual Studio 環境全体のブラウザーが変更されます。

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=true )]

internal class MyPackage : Package {}

グローバル フラグが false に設定されている場合、メタデータの変更は、現在の VSPackage でサポートされている現在のデザイナーに対してローカルになります。

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=false )]

internal class MyPackage : Package {}

Note

デザイン サーフェイスはコンポーネントの作成のみをサポートするので、コンポーネントだけがローカル メタデータを保持できます。 上記の例では、オブジェクトの Color プロパティなど、プロパティの変更を試みました。 グローバル フラグについて false が渡された場合、実際にはデザイナーによって Color のインスタンスが作成されないので、CustomBrowser は決して表示されません。 グローバル フラグを false に設定すると、コントロール、タイマー、ダイアログ ボックスなどのコンポーネントに役立ちます。