次の方法で共有


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

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

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

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

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

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

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

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

    これは通常、 UITypeEditor または TypeConverter メカニズムによって行われます。

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

  2. たとえば、イベントをサブスクライブしたり、プロジェクト構成情報を取得したりして、環境と統合します。 ITypeResolutionService インターフェイスを取得することで、プロジェクト構成情報を取得し、イベントをサブスクライブできます。

  3. 適切な ツールボックス カテゴリをアクティブ化するか、 ToolboxItemFilterAttribute クラスのインスタンスをデザイナーに適用してデザイナーの適用性を制限することによって、ユーザー環境を変更します。

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

VSPackage では、次の方法でデザイナーの初期化を処理する必要があります。

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

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

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

デザイナーまたはデザイナー コンポーネントが作成されるたびに、Visual Studio 環境は次のようになります。

  • 登録されている各デザイン サーフェイス拡張機能プロバイダーにアクセスします。

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

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

オブジェクトを VSPackage のメンバーとして実装する場合は、次の点を理解しておくことが重要です。

  • Visual Studio 環境では、特定の DesignSurfaceExtension プロバイダーが変更するメタデータやその他の構成設定を制御することはできません。 2 つ以上の DesignSurfaceExtension プロバイダーが、競合する方法で同じデザイナー機能を変更し、最終的な変更を確定することができます。 どの変更が最後に適用されるかは不確定です。

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

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

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

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

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

VSPackage のProvideDesignerMetadataAttributeの実装に適用されるPackageのインスタンスによって提供される変更には、次の 2 つのスコープのいずれかを指定できます。

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

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

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

次のように、Package オブジェクトのIsGlobal プロパティをProvideDesignerMetadataAttributeに設定したtrueの実装に属性を適用すると、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 {}

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