演练:提供自定义设计时元数据

使用 适用于 Visual Studio 的 WPF 设计器,可以为不同的设计器提供自定义设计时元数据。 例如,可以针对 Visual Studio 和 Expression Blend 中的自定义控件提供不同的设计体验。 若要向设计器注册自定义设计时元数据,请实现 IProvideAttributeTable 接口,并调用一个 AddCustomAttributes 方法。

本演练演示如何为 WPF 或 Silverlight 自定义控件库提供自定义设计时实现。 在本演练中,您将执行下列任务:

  • 创建一个 WPF 自定义控件库项目。

  • 为设计时元数据创建一个单独的程序集。

完成本演练后,您将了解如何为 WPF 或 Silverlight 自定义控件提供自定义设计时元数据。

提示

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置

系统必备

您需要以下组件来完成本演练:

  • Visual Studio 2010.

创建自定义控件

第一步是为 WPF 自定义控件创建项目。

创建自定义控件

  1. 使用 Visual Basic 或 Visual C# 新建一个名为 TailspinToysControlLibrary 的 WPF 自定义控件库项目。

    CustomControl1 的代码在“代码编辑器”中打开。

    提示

    如果您的自定义设计体验只需要面向 Expression Blend 4 和 Visual Studio 2010,请将项目的目标框架设置为 .NET Framework 4。 如果您的自定义设计体验必须面向 Expression Blend 3、Expression Blend 4 和 Visual Studio 2010,请将项目的目标框架设置为 .NET Framework 3.5。

  2. 在**“解决方案资源管理器”中,将代码文件的名称更改为 TailspinToysControl.cs 或 TailspinToysControl.vb。 如果出现消息框,询问是否对此项目中的所有引用执行重命名操作,请单击“是”**。

  3. 打开项目属性,然后选择**“生成”(对于 Visual Basic 选择“编译”**)选项卡。

  4. 将项目的输出路径设置为“bin\”。

  5. 生成解决方案。

创建设计时元数据程序集

设计时代码在特定元数据程序集中部署。 本演练中的自定义元数据受 Visual Studio 和 Expression Blend 支持,而且部署到名为 TailspinToysControlLibrary.Design 的程序集内。 有关命名程序集的更多信息,请参见部署自定义控件和设计时程序集

创建设计时元数据程序集

  1. 使用 Visual Basic 或 Visual C# 为解决方案添加一个名为 TailspinToysControlLibrary.Design 的新类库项目。

  2. 将项目的输出路径设置为“.. \TailspinToysControlLibrary\bin\”。 这样可使控件的程序集与元数据程序集位于同一文件夹中,从而可为设计器启用元数据发现。

  3. 添加对下列 WPF 和 XAML 程序集的引用。

    • PresentationCore

    • PresentationFramework

    • System.Xaml

    • WindowsBase

  4. 添加对下列 WPF 设计器程序集的引用。 

    • Microsoft.Windows.Design.Extensibility

    • Microsoft.Windows.Design.Interaction

    提示

    如果已经安装了 Expression Blend,则可能会在“添加引用”对话框中看到两组 WPF 设计器程序集。 选择随 Visual Studio 一起安装的两个程序集(位于 $(VSInstallDir)\Common7\IDE\PublicAssemblies 文件夹中)。

    提示

    如果 WPF 设计器程序集未出现在“添加引用”对话框中: 请单击“浏览”选项卡并导航到 $(VSInstallDir)\Common7\IDE\PublicAssemblies 文件夹中的程序集。

  5. 添加对 TailspinToysControlLibrary 项目的引用。

  6. 在**“解决方案资源管理器”**中,将 Class1 代码文件的名称更改为 RegisterMetadata.cs 或 RegisterMetadata.vb。

  7. 用下面的代码替换自动生成的代码。 此代码将创建一个 AttributeTable,用于将自定义设计时特性附加到 TailspinToysControl 类。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Microsoft.Windows.Design;
    using Microsoft.Windows.Design.Features;
    using Microsoft.Windows.Design.Metadata;
    
    using TailspinToysControlLibrary;
    
    // The ProvideMetadata assembly-level attribute indicates to designers
    // that this assembly contains a class that provides an attribute table. 
    [assembly: ProvideMetadata(typeof(TailspinToysControlLibrary.Design.RegisterMetadata))]
    namespace TailspinToysControlLibrary.Design
    {
        internal class RegisterMetadata : IProvideAttributeTable
        {
            // Called by the designer to register any design-time metadata. 
            public AttributeTable AttributeTable
            {
                get
                {
                    AttributeTableBuilder builder = new AttributeTableBuilder();
    
                    // Set ToolboxBrowsableAttribute to true to display your custom control 
                    // in the Toolbox and in the Choose Items... dialog box. 
                    builder.AddCustomAttributes(typeof(TailspinToysControl), new ToolboxBrowsableAttribute(true));
    
                    return builder.CreateTable();
                }
            }
        }
    }
    
  8. 生成解决方案。

后续步骤

请参见

任务

演练:为控件创建自定义工具箱图标

参考

AttributeTable

“选择工具箱项”对话框 ->“WPF 组件”选项卡

其他资源

演练:为工具箱图标提供元数据

工具箱图标

部署自定义控件和设计时程序集

提供设计时元数据