演练:为工具箱图标提供元数据
本演练演示如何在 Windows Presentation Foundation (WPF) 自定义控件库中,为不同的设计器(如 Visual Studio 和 Expression Blend)提供元数据。 将自定义控件添加到设计器的工具箱时,会在该控件的名称旁边显示一个相应的图标。
使用适用于 Visual Studio 的 WPF 设计器,可以为不同的设计器提供自定义的工具箱图标。 例如,可以针对 Visual Studio 和 Expression Blend 中的自定义控件提供不同的图标。 由设计时实现提供的图标将重写控件的运行时程序集内的默认图标。
在本演练中,您将执行下列任务:
创建一个具有嵌入图标位图的 WPF 自定义控件库项目。
为用来重写默认工具箱图标的设计时元数据创建一个单独的程序集。
在设计时测试控件的图标。
完成本演练后,您将知道如何在设计时替换自定义控件的默认运行时图标。
提示
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关更多信息,请参见 使用设置。
系统必备
您需要以下组件来完成本演练:
- Visual Studio 2010.
创建具有工具箱图标的自定义控件
若要为控件创建自定义工具箱图标,请将一个图像作为嵌入资源添加到控件的项目中。
创建具有工具箱图标的自定义控件
使用 Visual Basic 或 Visual C# 新建一个名为 TailspinToysControlLibrary 的 WPF 自定义控件库项目。
将 CustomControl1 代码文件重命名为 TailspinToysControl。
添加一个名为 TailspinToysControl.icon.bmp 的工具箱图标并将其作为嵌入的资源。 有关更多信息,请参见演练:为控件创建自定义工具箱图标。
使用**“文本工具”**在位图中绘制 DEFAULT(指示工具箱何时加载控件程序集的默认图标)。
将项目的输出路径设置为“.. \TailspinToysControlLibrary\bin\”。
生成解决方案。
创建设计时元数据程序集
设计时代码在特定元数据程序集中部署。 本演练中的自定义元数据受 Visual Studio 和 Expression Blend 支持,而且部署到名为 TailspinToysControlLibrary.Design 的程序集内。
创建设计时元数据程序集
创建一个名为 TailspinToysControlLibrary.Design 的设计时程序集。 有关更多信息,请参见演练:提供自定义设计时元数据。
在代码编辑器中打开 RegisterMetadata 代码文件。
用下面的代码替换自动生成的代码。 此代码将创建一个将自定义设计时特性附加到 TailspinToysControl 类的 AttributeTable。
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。
为 Visual Studio 创建设计时工具箱图标
向 TailspinToysControlLibrary.Design 项目中添加一个新的位图文件。 将该位图文件命名为 TailspinToysControlLibrary.TailspinToysControl.VisualStudio.24bit.48x48.bmp。
在“属性”窗口中,将位图的**“颜色”**属性设置为 24 bit。
使用**“文本工具”**在位图中绘制 METADATA(指示图标是在何时根据设计器元数据设置的)。
在**“解决方案资源管理器”**中选择该位图文件。
在“属性”窗口中,将**“生成操作”属性设置为“嵌入的资源”**。
向 TailspinToysControlLibrary.Design 项目中添加一个新的位图文件。 将该位图文件命名为 TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.bmp。
提示
Blend 仅加载 .png 文件作为图标,因此,可以使用外部画图程序创建 Blend 图标。
在图像编辑器中右击,然后从快捷菜单中选择**“打开外部编辑器”**。
画图应用程序将打开。
使用“文本工具”在位图中绘制 BLEND(指示要用在 Expression Blend 的**“资产”**窗口中的图标)。
将该图像另存为 .png 文件。
在**“解决方案资源管理器”中,右击“TailspinToysControlLibrary.Design”项目,指向“添加”,然后从快捷菜单中选择“现有项”**。
在**“添加现有项”对话框中,选择“TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.png”,然后单击“添加”**。
在**“解决方案资源管理器”**中,选择该 .png 图像文件。
在“属性”窗口中,将**“生成操作”属性设置为“嵌入的资源”**。
删除空的 TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.bmp 位图文件。
生成解决方案。
测试工具箱图标
通过将 TailspinToysControl 添加到工具箱来测试您的自定义工具箱图标。
测试工具箱图标
使用 Visual Basic 或 Visual C# 在解决方案中添加一个名为 TestApplication 的新 WPF 应用程序项目。
MainWindow.xaml 将在 WPF 设计器中打开。 在“工具箱”中,“TailspinToysControl” 出现在**“TailspinToysControlLibrary Controls”**选项卡中。 此时会出现默认控件图标,
提示
而不显示控件的运行时程序集内嵌入的图标。 这是工具箱自动填充功能的限制。
在工具箱中,右击**“TailspinToysControl”,从快捷菜单中选择“删除”,然后单击“确定”**。
**“TailspinToysControl1”**将从工具箱中移除。
在工具箱中,右击**“TailspinToysControlLibrary Controls”选项卡,然后从快捷菜单中选择“选择项”**。
随即打开**“选择工具箱项”**对话框。
单击**“WPF 组件”**选项卡。 有关更多信息,请参见“选择工具箱项”对话框 ->“WPF 组件”选项卡。
单击**“浏览”**选项卡,导航到 TailspinToysControlLibrary\TailspinToysControlLibrary\bin 文件夹。
双击**“TailspinToysControlLibrary.dl”l**将其选中。
TailspinToysControlLibrary 程序集的详细信息显示在**“选择工具箱项”对话框中。 您的自定义设计时图标显示在“TailspinToysControl”**组框中。
单击**“确定”**。
**“TailspinToysControl”出现在具有“TailspinToysControlLibrary.TailspinToysControl.VisualStudio.24bit.48x48.bmp”**图标的工具箱中,该图标将重写运行时程序集内的图标。
后续步骤
还可以在 Expression Blend 中加载自定义控件和设计时程序集。 从 Expression Blend 4 开始,当添加对 TailspinToysControlLibrary.dll 程序集的项目引用时,**“TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.png”图标显示在“资产”**窗口中。
可以通过使用 AssemblyFoldersEx 注册过程来部署运行时程序集和设计时程序集。 有关更多信息,请参见部署自定义控件和设计时程序集。