演练:提供自定义设计时元数据
使用 适用于 Visual Studio 的 WPF 设计器,可以为不同的设计器提供自定义设计时元数据。 例如,可以针对 Visual Studio 和 Expression Blend 中的自定义控件提供不同的设计体验。 若要向设计器注册自定义设计时元数据,请实现 IProvideAttributeTable 接口,并调用一个 AddCustomAttributes 方法。
本演练演示如何为 WPF 或 Silverlight 自定义控件库提供自定义设计时实现。 在本演练中,您将执行下列任务:
创建一个 WPF 自定义控件库项目。
为设计时元数据创建一个单独的程序集。
完成本演练后,您将了解如何为 WPF 或 Silverlight 自定义控件提供自定义设计时元数据。
提示
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。
系统必备
您需要以下组件来完成本演练:
- Visual Studio 2010.
创建自定义控件
第一步是为 WPF 自定义控件创建项目。
创建自定义控件
使用 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。
在**“解决方案资源管理器”中,将代码文件的名称更改为 TailspinToysControl.cs 或 TailspinToysControl.vb。 如果出现消息框,询问是否对此项目中的所有引用执行重命名操作,请单击“是”**。
打开项目属性,然后选择**“生成”(对于 Visual Basic 选择“编译”**)选项卡。
将项目的输出路径设置为“bin\”。
生成解决方案。
创建设计时元数据程序集
设计时代码在特定元数据程序集中部署。 本演练中的自定义元数据受 Visual Studio 和 Expression Blend 支持,而且部署到名为 TailspinToysControlLibrary.Design 的程序集内。 有关命名程序集的更多信息,请参见部署自定义控件和设计时程序集。
创建设计时元数据程序集
使用 Visual Basic 或 Visual C# 为解决方案添加一个名为 TailspinToysControlLibrary.Design 的新类库项目。
将项目的输出路径设置为“.. \TailspinToysControlLibrary\bin\”。 这样可使控件的程序集与元数据程序集位于同一文件夹中,从而可为设计器启用元数据发现。
添加对下列 WPF 和 XAML 程序集的引用。
PresentationCore
PresentationFramework
System.Xaml
WindowsBase
添加对下列 WPF 设计器程序集的引用。
Microsoft.Windows.Design.Extensibility
Microsoft.Windows.Design.Interaction
提示
如果已经安装了 Expression Blend,则可能会在“添加引用”对话框中看到两组 WPF 设计器程序集。 选择随 Visual Studio 一起安装的两个程序集(位于 $(VSInstallDir)\Common7\IDE\PublicAssemblies 文件夹中)。
提示
如果 WPF 设计器程序集未出现在“添加引用”对话框中: 请单击“浏览”选项卡并导航到 $(VSInstallDir)\Common7\IDE\PublicAssemblies 文件夹中的程序集。
添加对 TailspinToysControlLibrary 项目的引用。
在**“解决方案资源管理器”**中,将 Class1 代码文件的名称更改为 RegisterMetadata.cs 或 RegisterMetadata.vb。
用下面的代码替换自动生成的代码。 此代码将创建一个 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(); } } } }
生成解决方案。
后续步骤
本演练为您提供了一个解决方案,其中包含适用于 Visual Studio 和 Expression Blend 的自定义设计体验的基本实现。 可以通过执行以下演练来扩展此解决方案。
可以通过使用 AssemblyFoldersEx 注册过程来注册控件和设计时程序集。 有关更多信息,请参见部署自定义控件和设计时程序集。
可以从 WPF Designer Extensibility Samples(WPF 设计器扩展性示例)站点下载自定义设计时实现示例。