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

本演练演示如何在 Windows Presentation Foundation (WPF) 自定义控件库中,为不同的设计器(如 Visual Studio 和 Expression Blend)提供元数据。 将自定义控件添加到设计器的工具箱时,会在该控件的名称旁边显示一个相应的图标。

使用适用于 Visual Studio 的 WPF 设计器,可以为不同的设计器提供自定义的工具箱图标。 例如,可以针对 Visual Studio 和 Expression Blend 中的自定义控件提供不同的图标。 由设计时实现提供的图标将重写控件的运行时程序集内的默认图标。

在本演练中,您将执行下列任务:

  • 创建一个具有嵌入图标位图的 WPF 自定义控件库项目。

  • 为用来重写默认工具箱图标的设计时元数据创建一个单独的程序集。

  • 在设计时测试控件的图标。

完成本演练后,您将知道如何在设计时替换自定义控件的默认运行时图标。

提示

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

系统必备

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

  • Visual Studio 2010.

创建具有工具箱图标的自定义控件

若要为控件创建自定义工具箱图标,请将一个图像作为嵌入资源添加到控件的项目中。

创建具有工具箱图标的自定义控件

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

  2. 将 CustomControl1 代码文件重命名为 TailspinToysControl。

  3. 添加一个名为 TailspinToysControl.icon.bmp 的工具箱图标并将其作为嵌入的资源。 有关更多信息,请参见演练:为控件创建自定义工具箱图标

  4. 使用**“文本工具”**在位图中绘制 DEFAULT(指示工具箱何时加载控件程序集的默认图标)。

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

  6. 生成解决方案。

创建设计时元数据程序集

设计时代码在特定元数据程序集中部署。 本演练中的自定义元数据受 Visual Studio 和 Expression Blend 支持,而且部署到名为 TailspinToysControlLibrary.Design 的程序集内。

创建设计时元数据程序集

  1. 创建一个名为 TailspinToysControlLibrary.Design 的设计时程序集。 有关更多信息,请参见演练:提供自定义设计时元数据

  2. 在代码编辑器中打开 RegisterMetadata 代码文件。

  3. 用下面的代码替换自动生成的代码。 此代码将创建一个将自定义设计时特性附加到 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();
                }
            }
        }
    }
    
  4. 保存解决方案。

创建设计时工具箱图标

有了设计时程序集后,便可以创建自定义工具箱图标并将它们作为嵌入资源添加到项目了。 将创建两个图标,一个用于 Visual Studio,另一个用于 Expression Blend。

为 Visual Studio 创建设计时工具箱图标

  1. 向 TailspinToysControlLibrary.Design 项目中添加一个新的位图文件。 将该位图文件命名为 TailspinToysControlLibrary.TailspinToysControl.VisualStudio.24bit.48x48.bmp。

  2. 在“属性”窗口中,将位图的**“颜色”**属性设置为 24 bit。

  3. 使用**“文本工具”**在位图中绘制 METADATA(指示图标是在何时根据设计器元数据设置的)。

  4. 在**“解决方案资源管理器”**中选择该位图文件。

  5. 在“属性”窗口中,将**“生成操作”属性设置为“嵌入的资源”**。

  6. 向 TailspinToysControlLibrary.Design 项目中添加一个新的位图文件。 将该位图文件命名为 TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.bmp。

    提示

    Blend 仅加载 .png 文件作为图标,因此,可以使用外部画图程序创建 Blend 图标。

  7. 在图像编辑器中右击,然后从快捷菜单中选择**“打开外部编辑器”**。

    画图应用程序将打开。

  8. 使用“文本工具”在位图中绘制 BLEND(指示要用在 Expression Blend 的**“资产”**窗口中的图标)。

  9. 将该图像另存为 .png 文件。

  10. 在**“解决方案资源管理器”中,右击“TailspinToysControlLibrary.Design”项目,指向“添加”,然后从快捷菜单中选择“现有项”**。

  11. 在**“添加现有项”对话框中,选择“TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.png”,然后单击“添加”**。

  12. 在**“解决方案资源管理器”**中,选择该 .png 图像文件。

  13. 在“属性”窗口中,将**“生成操作”属性设置为“嵌入的资源”**。

  14. 删除空的 TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.bmp 位图文件。

  15. 生成解决方案。

测试工具箱图标

通过将 TailspinToysControl 添加到工具箱来测试您的自定义工具箱图标。

测试工具箱图标

  1. 使用 Visual Basic 或 Visual C# 在解决方案中添加一个名为 TestApplication 的新 WPF 应用程序项目。

    MainWindow.xaml 将在 WPF 设计器中打开。 在“工具箱”中,“TailspinToysControl” 出现在**“TailspinToysControlLibrary Controls”**选项卡中。 此时会出现默认控件图标,

    默认工具箱图标

    提示

    而不显示控件的运行时程序集内嵌入的图标。 这是工具箱自动填充功能的限制。

  2. 在工具箱中,右击**“TailspinToysControl”,从快捷菜单中选择“删除”,然后单击“确定”**。

    **“TailspinToysControl1”**将从工具箱中移除。

  3. 在工具箱中,右击**“TailspinToysControlLibrary Controls”选项卡,然后从快捷菜单中选择“选择项”**。

    随即打开**“选择工具箱项”**对话框。

  4. 单击**“WPF 组件”**选项卡。 有关更多信息,请参见“选择工具箱项”对话框 ->“WPF 组件”选项卡

  5. 单击**“浏览”**选项卡,导航到 TailspinToysControlLibrary\TailspinToysControlLibrary\bin 文件夹。

  6. 双击**“TailspinToysControlLibrary.dl”l**将其选中。

    TailspinToysControlLibrary 程序集的详细信息显示在**“选择工具箱项”对话框中。 您的自定义设计时图标显示在“TailspinToysControl”**组框中。

    带有自定义图标的“选择工具箱项”对话框

  7. 单击**“确定”**。

    **“TailspinToysControl”出现在具有“TailspinToysControlLibrary.TailspinToysControl.VisualStudio.24bit.48x48.bmp”**图标的工具箱中,该图标将重写运行时程序集内的图标。

    自定义工具箱图标

后续步骤

  • 还可以在 Expression Blend 中加载自定义控件和设计时程序集。 从 Expression Blend 4 开始,当添加对 TailspinToysControlLibrary.dll 程序集的项目引用时,**“TailspinToysControlLibrary.TailspinToysControl.Expression.4bit.48x48.png”图标显示在“资产”**窗口中。

  • 可以通过使用 AssemblyFoldersEx 注册过程来部署运行时程序集和设计时程序集。 有关更多信息,请参见部署自定义控件和设计时程序集

请参见

任务

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

参考

AttributeTable

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

其他资源

工具箱图标

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

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

提供设计时元数据