将多个 UI 元素连接到单个命令对象
一种简单的方法,将几个 UI 元素(菜单项、工具栏按钮等)分组在一起,使它们都执行相同的命令,并一起启用/禁用(带有 Visual Studio 设计器支持)。
引言
通常,当单击时,同时存在一个菜单项和一个工具栏按钮来执行相同的操作。有时,甚至还有第三个或第四个控件(比如一个按钮和一个上下文菜单项)做同样的事情。这些控件需要一起启用和禁用。
本文中的代码允许将每个此类控件连接到 UICommand
对象,方法是在 Visual Studio 设计器中设置一个属性。 UICommand
对象有一个 Enabled
属性,用于启用或禁用所有关联的控件。 它还有一个 Execute
事件,当单击任何控件时,该事件会被触发。
使用代码
下载演示代码。 CommandDemo 项目包含两个类,UICommand
和 UICommandProvider
。 将关联的文件复制到您的项目中并编译。 只要表单设计器打开,这些类就会出现在工具箱中,如下所示
首先,将 UICommandProvider
的一个实例拖到表单上。 它将出现在设计器的组件区域(靠近底部),如上图所示。 每个表单只需要一个 UICommandProvider
实例。 因为 UICommandProvider
实现了 IExtenderProvider
,并且它的 CanExtend
方法对任何派生自 ToolStripItem
或 Control
的对象都返回 true
,所以 Visual Studio 设计器会将一个新属性添加到这些对象中。 该属性的类型为 UICommand
。
演示项目包含两个 UICommand
实例:uiCommand1
和 uiCommand2
。 其中每个对象都连接到另外四个控件:一个普通按钮、一个工具栏按钮、一个菜单项(在“命令”菜单下)和一个上下文菜单项。 这是通过将两个 UICommand
实例拖到表单上,然后将每个控件的 UICommand
属性设置为 UICommand
的相应实例来完成的。 例如,以下屏幕截图显示了 button2.UICommand
被设置为 uiCommand2
结果是,每当单击 button2
(或其 UICommand
属性设置为 uiCommand2
的任何其他控件)时,就会触发事件 uiCommand2
.Execute
。 此外,每当设置 uiCommand2
.Enabled
时,也会设置关联控件的 Enabled
属性。
为了本演示的目的,每个 UICommand
的 Execute
处理程序都只是切换另一个 UICommand
的 Enabled
属性。 这使得很容易看到一行代码可以启用或禁用表单上的几个控件。 以下是两个事件处理程序
private void uiCommand1_Execute(object sender, EventArgs e) {
uiCommand2.Enabled = !uiCommand2.Enabled;
}
private void uiCommand2_Execute(object sender, EventArgs e) {
uiCommand1.Enabled = !uiCommand1.Enabled;
}
UICommand
可能会被扩展为具有 Image
属性,该属性导致关联控件具有相同的图像(如果合适),ToolTip
属性为所有控件分配相同的工具提示文本等等。 我将其留给读者作为练习。