设计器初始化和元数据配置

对与设计器或设计器组件关联的元数据和筛选器属性的操作为应用程序提供了一种机制,用于定义特定设计器使用哪些工具来处理不同的 Type 对象(例如数据结构、类或图形实体),当设计器可用时,以及 Visual Studio IDE 配置为支持设计器的方式(例如 工具箱 类别或选项卡可用)。

Visual Studio SDK 提供了多种机制,可帮助控制设计器或设计器组件的初始化以及 VSPackage 对其元数据的操作。

初始化元数据和配置信息

由于 VSPackage 是按需加载的,因此在设计器实例化之前,Visual Studio 环境可能尚未加载 VSPackage。 因此,VSPackages 无法使用标准机制在创建时配置设计器或设计器组件,即处理 DesignerCreated 事件。 相反,VSPackage 实现接口的 DesignSurfaceExtension 实例并注册自身以提供自定义项,称为设计图面扩展。

自定义初始化

自定义设计器、组件或设计器图面涉及:

  1. 修改设计器元数据并有效地更改特定访问或转换方式 Type

    这通常是通过或TypeConverter机制完成的UITypeEditor

    例如,当基于设计器的设计器初始化时System.Windows.Forms,Visual Studio 环境会UITypeEditorImage修改与设计器一起使用的对象,以使用资源管理器来获取位图而不是文件系统。

  2. 例如,通过订阅事件或获取项目配置信息来与环境集成。 可以通过获取接口来获取项目配置信息并订阅事件 ITypeResolutionService

  3. 通过激活适当的 工具箱 类别或通过将类实例 ToolboxItemFilterAttribute 应用于设计器来限制设计器的适用性来修改用户环境。

VSPackage 的设计器初始化

VSPackage 应通过以下方式处理设计器初始化:

  1. 创建实现 DesignSurfaceExtension 类的对象。

    注意

    DesignSurfaceExtension不应在类所在的同一对象Package上实现该类。

  2. 注册实现 DesignSurfaceExtension 为 VSPackage 设计器扩展提供支持的类。 通过应用 的实例DesignSurfaceExtensionAttributeProvideObjectAttribute以及ProvideServiceAttribute提供 VSPackage 实现的Package类来注册类。

每当创建设计器或设计器组件时,Visual Studio 环境:

将对象实现 DesignSurfaceExtension 为 VSPackage 的成员时,请务必了解:

  • Visual Studio 环境不提供对特定 DesignSurfaceExtension 提供程序修改的元数据或其他配置设置的任何控制。 可以通过冲突的方式修改同一设计器功能的两个或多个 DesignSurfaceExtension 提供程序,最终修改是明确的。 最后应用修改是不确定的。

  • 可以通过向该实现的实例应用对象实例ToolboxItemFilterAttribute,将对象的实现DesignSurfaceExtension显式限制为特定设计器。 有关工具箱项筛选的详细信息,请参阅ToolboxItemFilterAttributeToolboxItemFilterType

其他元数据预配

VSPackage 可以更改设计时以外的设计器或设计器组件的配置。

ProvideDesignerMetadataAttribute 类可以编程方式使用,也可以应用于提供设计器的 VSPackage。

类的 ProvideDesignerMetadataAttribute 实例用于修改在设计图面上创建的组件的元数据。 例如,可以将对象使用 CommonDialog 的默认属性浏览器替换为自定义属性浏览器。

应用于 VSPackage 实现Package的实例ProvideDesignerMetadataAttribute提供的修改可以有以下两个范围之一:

  • 全局 -- 给定组件的所有新实例

  • 本地 - 仅适用于在当前 VSPackage 提供的设计图面上创建的组件的实例。

IsGlobal应用于 VSPackage 实现Package的实例的属性ProvideDesignerMetadataAttribute决定了此范围。

将属性应用于对象设置为trueProvideDesignerMetadataAttribute实现PackageIsGlobal,如下所示,更改整个 Visual Studio 环境的浏览器:

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=true )]

internal class MyPackage : Package {}

如果全局标志设置为 false,则元数据更改是当前 VSPackage 支持的当前设计器的本地更改:

[ProvideDesignerMetadata(typeof(Color), typeof(CustomBrowser), IsGlobal=false )]

internal class MyPackage : Package {}

注意

设计图面仅支持创建组件,因此只有组件可以具有本地元数据。 在上面的示例中,我们尝试修改属性,例如 Color 对象的属性。 如果 false 为全局标志传入,则永远不会显示, CustomBrowser 因为设计器从未实际创建实例 Color。 将全局标志设置为 false 对控件、计时器和对话框等组件非常有用。