如何:使用元数据存储区

更新:2007 年 11 月

当您使用扩展性自定义 Visual Studio Windows Presentation Foundation (WPF) 设计器时,通常会创建自定义控件。控件的代码以及定义控件的设计时行为的元数据分解为不同的程序集。元数据分解为 MetadataStore。有关更多信息,请参见 WPF 设计器扩展性体系结构

元数据存储区包含有关设计时行为(如自定义装饰器、自定义上下文菜单和自定义属性编辑器)的信息。元数据存储区实现为基于代码的属性表。

说明:

元数据程序集按如下顺序加载:首先加载 *.Design.dll,然后加载 *.VisualStudio.Design.dll 或 *.Expression.Design.dll。这样特定于设计器的元数据便可以覆盖公用的共享元数据。

向元数据存储区中添加自定义属性表

当设计器加载自定义控件时,会在相应的设计时程序集中查找实现 IRegisterMetadata 的类型。如果找到,便会自动实例化该类型并调用它的 Register 方法。

向元数据存储区中添加自定义属性表

  1. 在您的控件的通用设计时程序集 (<您的控件>.Design.dll) 中,添加一个名为 Metadata.cs 或 Metadata.vb 的文件。

  2. 在该 Metadata 文件中,添加一个实现 IRegisterMetadata 的类,并实现 Register 方法。

  3. 实例化一个 AttributeTableBuilder 对象,并调用 AddCustomAttributes 方法以便向其中添加属性。

  4. 调用 AddAttributeTable 方法以便将 AttributeTable 添加到元数据存储区中。

  5. 对特定于 Visual Studio 的设计时程序集 (<您的控件>.VisualStudio.Design.dll) 重复步骤 1 至 4。

示例

下面的示例为自定义控件添加元数据。该代码将自定义属性编辑器连接到自定义控件的某个属性。

internal class Metadata : Microsoft.Windows.Design.Metadata.IRegisterMetadata
{
    public void Register()
    {
        Microsoft.Windows.Design.Metadata.AttributeTableBuilder builder = new Microsoft.Windows.Design.Metadata.AttributeTableBuilder();

        //Property Editor
        builder.AddCustomAttributes(typeof(<Your Custom Control>), <Property>, new System.ComponentModel.EditorAttribute(typeof(<Your Custom Editor>), typeof(<Your Custom Editor>)));

        //Category Editor
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new System.ComponentModel.EditorAttribute(typeof(<Your Custom Editor>), typeof(<Your Custom Editor>)));

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable());
    }
}
Friend Class Metadata
    Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata

    Public Sub Register() Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata.Register

        Dim builder As New Microsoft.Windows.Design.Metadata.AttributeTableBuilder()

        'Property Editor
        builder.AddCustomAttributes(GetType(<Your Custom Control>), <Property>, New System.ComponentModel.EditorAttribute(GetType(<Your Custom Editor>), GetType(<Your Custom Editor>)))

        'Category Editor
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New System.ComponentModel.EditorAttribute(GetType(<Your Custom Editor>), GetType(<Your Custom Editor>)))

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable())
    End Sub
End Class

下面的示例为自定义控件添加元数据。该代码将自定义装饰器和自定义上下文菜单连接到自定义控件。

internal class Metadata : Microsoft.Windows.Design.Metadata.IRegisterMetadata
{
    public void Register()
    {
        Microsoft.Windows.Design.Metadata.AttributeTableBuilder builder = new Microsoft.Windows.Design.Metadata.AttributeTableBuilder();

        //Adorners
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new Microsoft.Windows.Design.Features.FeatureAttribute(typeof(<Your Custom Adorner Provider>)));
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new Microsoft.Windows.Design.Features.FeatureAttribute(typeof(<Your Custom Adorner Provider>)));

        //MenuActions
        builder.AddCustomAttributes(typeof(<Your Custom Control>), new Microsoft.Windows.Design.Features.FeatureAttribute(typeof(<Your Custom Context Menu Provider>)));

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable());
    }
}
Friend Class Metadata
    Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata

    Public Sub Register() Implements Microsoft.Windows.Design.Metadata.IRegisterMetadata.Register

        Dim builder As New Microsoft.Windows.Design.Metadata.AttributeTableBuilder()

        'Adorners
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New Microsoft.Windows.Design.Features.FeatureAttribute(GetType(<Your Custom Adorner Provider>)))
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New Microsoft.Windows.Design.Features.FeatureAttribute(GetType(<Your Custom Adorner Provider>)))

        'MenuActions
        builder.AddCustomAttributes(GetType(<Your Custom Control>), New Microsoft.Windows.Design.Features.FeatureAttribute(GetType(<Your Custom Context Menu Provider>)))

        Microsoft.Windows.Design.Metadata.MetadataStore.AddAttributeTable(builder.CreateTable())
    End Sub
End Class

请参见

概念

元数据存储区

参考

AdornerProvider

ContextMenuProvider

其他资源

基本扩展性概念

了解 WPF 设计器扩展性

WPF 设计器扩展性