Windows 窗体的设计器命令和 DesignerAction 对象模型
设计器命令和 DesignerAction 对象模型为您提供了一种在设计时指定一组组件操作的通用方法。然后用户可以从设计图面访问这些操作,通常通过单击组件的智能标记标志符号 () 并从智能标记面板中选择一种提供的操作来进行访问。此模型统一了设计器为用户提供命令的各种方式。
智能标记
智能标记功能使组件和控件能够为用户显示区分上下文的信息和命令。可以将智能标记视为设计器谓词的替代技术,因为您可以选择在智能标记面板中显示智能标记项,也可以选择在与组件或控件相关的快捷菜单中显示智能标记项。
有关如何能够实现智能标记的完整示例,请参见如何:向 Windows 窗体组件附加智能标记。
设计器命令类
下表介绍了在您开发组件和控件时向您公开设计器命令的方式。
类 |
说明 |
---|---|
一个附加到命令 ID 的委托。它不定义命令文本、命令文本的位置或其他元数据。 |
|
一个菜单命令,它还定义其文本和其他元数据。谓词通常是按设计器提供的,并且是特定于设计器的。设计器谓词通常显示在快捷菜单上或主菜单栏的“视图”菜单上。 |
|
一个菜单命令,用于定义文本和其他元数据以描述可以执行的目标操作。操作通常引导用户完成某个多步骤过程,例如为组件配置数据源。 |
推送模型和拉取模型
下表列出了两种用于以编程方式访问设计器命令的模型。
模型 |
说明 |
---|---|
推 |
设计器明确请求服务并向该服务添加命令。 |
拉取 |
服务向设计器查询它提供的命令。 |
统一现有命令
在前面的设计器命令类表中列出的各种命令之间有很多相似之处。DesignerAction API 将这些命令综合了起来,提供了一种用来向设计器的用户公开命令的统一模型。
说明 |
---|
并非所有设计器都支持所有模型。设计器可以查询提供了哪些种支持,然后可以据此更改它提供命令的方式。此外,并非所有种类的命令都同时支持推送和拉取两种模型。并非所有设计器都将设计器操作公开为智能标记。例如,有些设计器可能会在一个工具窗口中公开设计器操作。 |
DesignerAction 对象模型
下表描述了实现 DesignerAction 对象模型的重要的类。
类 |
说明 |
---|---|
表示智能标记面板上的面板项。 |
|
定义用于创建智能标记面板的项的列表。 |
|
建立管理组件的 DesignerActionItem 对象集合的设计时服务。 |
|
表示面板上的静态文本项。派生自 DesignerActionItem。 |
|
表示与从 DesignerActionList 派生的类中的属性相关的面板项。派生自 DesignerActionItem。 |
|
表示与从 DesignerActionList 派生的类中的方法相关的面板项。派生自 DesignerActionItem。 |
|
表示智能标记面板上的静态标题项。派生自 DesignerActionTextItem。 |
使用 DesignerAction 对象模型
若要启用您的组件或控件的设计器操作,应从 DesignerActionList 基类进行派生。请使用此派生类来填充一个智能标记面板,用此面板表示类似菜单的 UI。
您的派生类可能重写 virtualGetSortedActionItems 方法以返回从 DesignerActionItem 派生的对象的集合。这些对象表示面板项。各项按照其类型显示在面板中。例如,DesignerActionTextItem 显示为静态文本标签。由 DesignerActionPropertyItem 和 DesignerActionMethodItem 类型表示的活动面板项分别有一个对应的、可公开访问的属性或方法,用于实现该项的功能。
创建派生类后,有两种方法可以将其添加到控件:
使用拉取模型,将您的派生类的实例添加到 ComponentDesigner 类上的 ActionLists 属性。这为通过继承类来提供其他操作列表以及为合并类的项目提供了一种方法。
使用推送模型,通过调用 Add 将派生类的实例添加到由全局 DesignerActionService 维护的集合中。这些操作列表将与由 ComponentDesigner 维护的集合中的列表合并。
DesignerActionPropertyItem 在设计器中由其对应的 UITypeEditor 表示。DesignerActionMethodItem 在设计器中由活动的调用程序员提供的方法的 UI 元素(如超链接)表示。您的操作列表的 GetSortedActionItems 方法实现按照将在智能标记面板中显示的顺序返回属性和方法。
有关实现智能标记的完整示例,请参见主题 如何:向 Windows 窗体组件附加智能标记。
操作列表中的现有谓词
使用现有的 DesignerVerb 实现的控件和组件自动接收 DesignerActionList 支持。设计环境通过查询组件的设计器寻找操作列表;如果没有可用的操作列表,则为现有谓词创建一个操作列表。
快捷菜单中的操作列表项
如果希望项显示在快捷菜单和操作列表中,可以在 DesignerActionMethodItem 上指定 IncludeAsDesignerVerb 标志。
调用 Add 时,会扫描操作列表,以检查是否存在任何设置了 IncludeAsDesignerVerb 标志的 DesignerActionMethodItem。如果有设置该标志的项,则为该项调用 AddVerb 方法以将该项添加到组件的谓词中,这样也就将其添加到了快捷菜单中。
更改设计器命令类型
我们对 .NET Framework 1.1 版中的 MenuCommand 和 DesignerVerb 类稍微做了一些更改,使它们能够支持 DesignerAction 对象模型。现在这两种类型都公开了一个名为 Properties 的新属性,该属性是一个存储命令对象的所有公共属性的 IDictionary。字典键是公共属性的名称。这样便可以进行属性的一般性枚举;同时,还为添加新属性提供了一个一致的基础,在这个基础上,不必修改类定义就可添加新属性。
此外,MenuCommandService 类还提供了 IMenuCommandService 的标准实现,并且可以执行正确的谓词集成。此类可引发用于通知对命令所做的添加和移除的事件。使用此类,您可以创建基于这些事件结果的 UI。MenuCommandService 及 IMenuCommandService 均包含在服务容器中。