WPF コントロールまたは Silverlight コントロールのカスタム デザイン環境を作成するときに、それらの環境を別々のデザイン時アセンブリに配置します。 これらのカスタム デザイン時実装でツールと対話する方法 (Visual Studio、Expression Blend など) を指定するには、メタデータ属性を格納するテーブルを作成します。
デザイン時アセンブリ
Visual Studio などのデザイン ツールでは、カスタム コントロールのアセンブリが開くと、関連付けられているデザイン時アセンブリも検索します。 デザイン ツールでは、特にアセンブリ レベルの ProvideMetadataAttribute 属性を探します。 この属性が見つかると、デザイナーで IProvideAttributeTable インターフェイスを実装するクラスのアセンブリを検索します。 デザイナーでは、デザイン時の動作を指定する属性コレクションに対してこのクラスの AttributeTable プロパティを照会します。 詳細については、「チュートリアル: カスタムのデザイン時メタデータの提供」および「カスタム コントロールとデザイン時アセンブリの配置」を参照してください。
属性テーブル
AttributeTable クラスは、デザイン時メタデータ属性を WPF および Silverlight の型に関連付けます。 属性テーブルでは、デザイン可能な型に固有のデザイン時実装を指定します。 たとえば、コントロールにカスタムの AdornerPanel がある場合、FeatureAttribute を属性に追加して、カスタムの FeatureProvider 実装を指定します。
属性テーブル ビルダー
属性テーブルの作成は、まず AttributeTableBuilder クラスのインスタンスを作成することから始まります。 AddCustomAttributes メソッドを呼び出して、メタデータを属性テーブル ビルダーに追加します。 メタデータの追加を終了したら、CreateTable メソッドを呼び出して、属性テーブルを作成します。 属性テーブル ビルダーのメソッドはコールバック デリゲートをサポートしているため、属性テーブルの作成を必要になるまで延期できます。
属性テーブルを使用してカスタム装飾の実装を指定する方法を次のコードに示します。
' Container for any general design-time metadata to initialize.
' Designers look for a type in the design-time assembly that
' implements IProvideAttributeTable. If found, designers instantiate
' this class and access its AttributeTable property automatically.
Friend Class Metadata
Implements IProvideAttributeTable
' Accessed by the designer to register any design-time metadata.
Public ReadOnly Property AttributeTable() As AttributeTable _
Implements IProvideAttributeTable.AttributeTable
Get
Dim builder As New AttributeTableBuilder()
' Add the adorner provider to the design-time metadata.
builder.AddCustomAttributes(GetType(ButtonWithDesignTime), _
New FeatureAttribute(GetType(OpacitySliderAdornerProvider)))
Return builder.CreateTable()
End Get
End Property
End Class
// Container for any general design-time metadata to initialize.
// Designers look for a type in the design-time assembly that
// implements IProvideAttributeTable. If found, designers instantiate
// this class and access its AttributeTable property automatically.
internal class Metadata : IProvideAttributeTable
{
// Accessed by the designer to register any design-time metadata.
public AttributeTable AttributeTable
{
get
{
AttributeTableBuilder builder = new AttributeTableBuilder();
// Add the adorner provider to the design-time metadata.
builder.AddCustomAttributes(
typeof(ButtonWithDesignTime),
new FeatureAttribute(typeof(OpacitySliderAdornerProvider)));
return builder.CreateTable();
}
}
}
詳細については、「チュートリアル : デザイン時装飾の作成」を参照してください。
デザイン時実装の基本ワークフロー
カスタムのデザイン環境を作成する場合、通常、類似のワークフローに従います。 詳細については、「方法: カスタム コントロールとデザイン時アセンブリを配置する」を参照してください。
カスタムのデザイン時環境の実装方法の例については、「WPF and Silverlight Designer Extensibility Samples (WPF デザイナーおよび Silverlight デザイナーの機能拡張のサンプル)」を参照してください。
分離されたデザイン時アセンブリの利点
WPF Designer for Visual Studio フレームワークは、デザイン時のメタデータを実装から切り離します。 メタデータをコントロールの実行時コードから切り離すことは、重要なデザイン上の原則です。その理由は、次のとおりです。
チーム間で物流の往復と統合が繰り返されると、メタデータをコントロールにコンパイルする作業の効率が低下する可能性があります。
メタデータをコンパイルしてコントロールに含めると、WPF デザイナー や Expression Blend などの外部ツールを使用して後でメタデータを変更することができなくなります。 これはアジリティ (敏捷性) に影響する大きな問題です。 デザイン時メタデータがコントロールから分離されていない場合、Visual Studio でデザイナーのバージョン管理を行うには、.NET Framework の新しいバージョンが必要になります。
メタデータをコンパイルしてコントロールに含めると、コントロール アセンブリのサイズが著しく増えます。 また、デザイン時属性はコントロールの動作を遅くします。 メモリに読み込まれる属性が増えることにより、リフレクションを使用するデータ バインディングなどのコントロール機能が影響を受けます。
デザイン時メタデータは、デザイナーの "個性" を提供します。 デザイナーの機能は、主として、コントロールではなく、デザイナーをホストするアプリケーションに結び付けられています。 WPF デザイナー および Expression Blend では、異なるメタデータを使用して、特定の種類のユーザーを対象とする機能セットが提供されます。