Windows 窗体的命令开关板
用于用户界面命令的开关板组件,支持设计时。
引言
本文介绍了一个用于通过集中的切换面板路由菜单和工具栏项事件的组件,以便于执行和更新。Windows Forms 的设计时支持也是该软件的重要组成部分。
背景
我一直觉得 MFC 中的命令更新和执行架构非常易于使用。尽管 Windows Forms 有很多优点,但它仍然缺少这种架构:一种易于隔离的机制,可以根据应用程序状态更新菜单和工具栏。我还想研究 Windows Forms 的设计时支持,看看有什么可能性。因此,我编写了这个切换面板,为 Windows Forms 提供类似的功能。
描述
应用程序命令代表您想在应用程序中执行的操作。它可以由 UI 项触发,UI 项可以是菜单项、工具栏项,或者直接来自代码。您的应用程序应该只处理应用程序命令的更新和执行,而不是直接连接到 UI 项。对 UI 项的更改会反映在应用程序命令和其他关联的 UI 项中。
应用程序命令可以由 UI 项执行。通常,这是一个菜单或工具栏项的点击。然而,它也可以是组合框中的选择更改,或者编辑框中更改的文本。UI 项中的任何事件都可以用来执行命令。可以有一个全局执行处理程序,和/或每个应用程序命令有一个特定的执行处理程序。这些命令也可以直接从代码中执行。
应用程序命令有时需要更新。更新通常包括启用/禁用、选中/取消选中或显示/隐藏。更新也可以是选择组合框中的元素或更改编辑框中的文本。可以有一个全局更新处理程序,和/或每个应用程序命令有一个特定的更新处理程序。更新可以针对应用程序命令或针对每个 UI 项激活。当显示上下文菜单时,UI 项应该被更新。通过将上下文菜单添加到上下文菜单集合中,当菜单显示时,上下文菜单中的所有 UI 项都会被更新。
UISwitchboard
使用适配器模式来支持不同类型的菜单和工具栏实现。适配器实现 UISwitchboard
定义的接口。通过每个类型的适配器支持 .NET 2.0 的 Toolstrip 菜单和工具栏,以及 .NET 1.x 的菜单和工具栏。编写另一个适配器来支持第三方菜单和工具栏包也很容易。
Using the Code
将组件添加到工具箱
要使用 Switchboard 组件,您必须通过选择工具箱上下文菜单中的“选择项...”菜单项将其添加到 Visual Studio 工具箱中。在“。NET Framework 组件”选项卡中,选择“浏览”按钮,然后浏览 UISwitchboard.dll 程序集。现在,工具箱的“菜单和工具栏”组下应该会出现两个新组件:ToolStripUISwitcboard
和 MenuToolBarUISwitchboard
。
将组件添加到窗体
您现在可以将组件添加到 Windows Form 中。只需将组件从工具箱拖放到窗体表面即可。组件现在已添加到窗体中,并显示在窗体下方,以及您添加的所有其他组件。您现在可以更改组件的名称和其他属性。此操作会将 UISwitchboard
程序集的引用添加到项目中。
创建应用程序命令
下一步是定义所有应用程序命令。这些命令应该是您将在应用程序中执行的一组逻辑命令。您可以使用组件上的智能标签菜单或组件属性来打开“应用程序命令集合编辑器”。此编辑器用于添加、删除或编辑应用程序命令。
您还可以通过使用 UISwitchboard
类的属性和方法直接从代码中创建应用程序命令。
将 UI 项与命令关联
应用程序命令由 UI 项触发。项必须与命令关联才能触发命令的执行。可以从应用程序命令属性中编辑此关联,方法是打开“UIItems
”集合。这将打开“UIItem 关联编辑器”。此编辑器显示所有可用的项以及哪些项与当前命令关联。您现在可以添加或删除项与当前命令之间的关联。
您还可以通过选择一个 UI 项并使用该项的“ApplicationCommand on xx
”属性来编辑关联。从下拉列表中选择要关联的应用程序命令,如果想移除关联,则选择“(无)”。
处理执行和更新
要处理执行和更新事件,请将事件处理程序添加到 UISwitchboard
组件的“ApplicationCommandExecute
”和“ApplicationCommandUpdate
”事件。这些事件处理程序接收一个“ApplicationCommandEventArgs
”参数,其中包含有关触发事件的命令和项的信息。通过检查这些属性,您可以更新命令或项,并在代码中执行相应的操作。下面的代码示例显示了一个通用的执行处理程序,当命令执行时,它会在消息框中显示可用信息。
private void toolStripExtensionCommandSwitchboard1_CommandExecute(
object sender, ApplicationCommandEventArgs e)
{
Control owner = sender as Control;
ApplicationCommand command = e.ApplicationCommand;
ToolStripItem item = e.Item as ToolStripItem;
string ownerName = "null";
if (owner != null)
{
ownerName = owner.Name;
}
string itemName = "null";
if (item != null)
{
itemName = item.Name;
}
System.Windows.Forms.MessageBox.Show("G Executing command:" +
command.ApplicationCommandName + " owner:" + ownerName +
" item:" + itemName);
}
下面的代码示例展示了更新处理程序如何根据应用程序状态更新 UI 项。
private void toolStripExtensionCommandSwitchboard1_CommandUpdate(
object sender, ApplicationCommandEventArgs e)
{
Control owner = sender as Control;
ApplicationCommand command = e.ApplicationCommand;
ToolStripItem item = e.Item as ToolStripItem;
switch (command.ApplicationCommandName)
{
case "New":
e.ApplicationCommand.Enabled = checkBoxEnableNew.Checked;
break;
case "FileCopy":
e.ApplicationCommand.Enabled = checkBoxEnableGlobalCopy.Checked;
break;
case "ContextCopy":
e.ApplicationCommand.Enabled = checkBoxEnableLocalCopy.Checked;
break;
case "Save":
e.ApplicationCommand.Visible = checkBoxShowSave.Checked;
break;
case "TrackBar":
toolStripProgressBar1.Value = toolStripTrackBar1.Value * 10;
break;
}
}
您也可以在应用程序命令上直接添加这些事件的处理程序,如果直接在全局事件处理程序中处理命令比在应用程序命令级别处理更方便的话。
关联上下文菜单
上下文菜单需要与 UISwitchboard
组件关联,以便在上下文菜单显示时更新上下文菜单的 UI 项。您必须将上下文菜单与 UISwitchboard
关联。您可以使用组件上的智能标签菜单或组件属性来打开“上下文菜单关联编辑器”。您现在可以从关联列表中添加或删除上下文菜单。
.NET 2.0 支持的 UI 项
以下 UI 项支持 .NET 2.0
ToolStripItem
ToolStripButton
ToolStripLabel
ToolStripComboBox
ToolStripTextBox
ToolStripProgressBar
ToolStripDropDownItem
ToolStripMenuItem
ToolStripSplitButton
ToolStripDropDownButton
ToolStripStatusLabel
ContextMenuStrip
.NET 1.x 支持的 UI 项
以下 UI 项支持 .NET 1.0 和 1.1
MenuItem
ToolBarButton
ContextMenu
可扩展性
切换面板通过使用适配器模式设计,具有可扩展性。适配器处理需要了解 UI 项实现的任务。我已经包含了旧的 .NET 1.x 菜单和工具栏类以及 .NET 2.0 菜单和工具栏类的适配器。为第三方菜单和工具栏包编写适配器应该很容易。由于设计时支持在加载窗体时实例化一个组件,因此您还必须提供一个派生自 UISwitchboard
的特定类,该类在构造函数中实例化正确的适配器。也可以扩展现有的适配器来支持您自己的自定义菜单或工具栏控件,以及标准控件。源代码包含此扩展的示例。
设计时支持
此组件的目标是方便地添加应用程序命令并将其连接到用户界面项。解决方案是设计时支持。设计时支持应该自动化查找所有可用的 UI 项并将它们呈现给易于使用的用户界面等任务。
UISwitchboard 设计器
具有设计时支持的组件需要一个设计器。UISwitchboardComponentDesigner
类实现了支持 UISwitchboard
组件所需的功能。
智能标签
类似于 Office 智能标签,Visual Studio 智能标签使常用的任务可用于您的工作上下文。组件设计器类支持定义应作为智能标签命令提供的命令。
应用程序命令
应用程序命令通过“ApplicationCommand
集合编辑器”进行编辑。此设计时窗体支持创建、删除和编辑应用程序命令。
UI 项关联
每个 UI 项都需要与应用程序命令关联。此设计时窗体支持将 UI 项与当前应用程序命令关联。
属性扩展程序
也可以从项属性中关联一个项。我使用属性扩展程序向每个支持的项添加一个属性,该属性允许您选择一个应用程序命令。
关注点
除了许多小的体会之外,在此编程练习期间还发生了两个主要的顿悟
- 设计时对象始终需要继承自
Component
类。这将使所有设计时支持神奇地正常工作。没有这种继承,就会发生奇怪的事情。 - 组件的属性在设计时必须同时具有
get
和set
方法才能进行序列化。 - 我在查找有关某些设计时功能的信息时遇到了困难。当我在最后使用 Reflector 检查 Microsoft
SplitterPanel
组件时,一切都变得容易了,我只需要几行代码就可以让一切正常工作。
我已通过 Sandcastle 和 SandcastleBuilder 生成了参考手册。这包含在源代码下载中。
条款和条件
UISwitchboard
组件是免费软件,并提供源代码。您可以在商业或非商业应用程序中自由使用它。组件的作者 Bjørn Sundby 拥有该组件的版权,不对因使用该组件而直接或间接造成的任何应用程序损坏负责。
历史
2007.05.01
- 原文