在本教程的前一章中,我们讨论了如何处理事件,例如当用户点击按钮或菜单项时。 然而在现代的用户界面中,通常从多个位置访问函数,由不同的用户动作调用。
例如,如果您有一个带有主菜单和一组工具栏的典型界面,则可以在菜单,工具栏,上下文菜单(例如,在主应用程序区域中单击鼠标右键时)使用新建(New)或打开(Open)等操作,以及使用键盘快捷键,如Ctrl+N和Ctrl+O.
对应上面的每种行为的响应代码都完全一样,但是在WinForms 应用程序中,你不得不为每一种行为定义一个对应的event 然后调用相同的方法。在上面的例子中,将会最少产生三个事件处理,另外加上处理键盘快捷键的代码。这不是一种理想的处理方法。
在WPF中,微软尝试使用命令这个概念来解决这个问题。它允许在一个地方定义命令,并且在所有的用户接口控件之中调用这些命令,例如menu,ToolBar 按钮等等。WPF会监听键盘快捷键,并且如果存在合适的命令,会直接调用,这使得命令成为一个理想的在应用中提供快捷键的方式。
在处理同一函数的多个入口时,命令也解决了另一个麻烦。在WinForms应用程序中,您将负责编写可在操作不可用时禁用用户界面元素的代码。例如,如果您的应用程序能够使用剪切命令(如Cut),但仅在选择了文本时,您必须在每次文本选择更改时手动启用和禁用主菜单项,工具栏按钮和上下文菜单项。
使用WPF命令,这是集中的。使用一种方法,您可以决定是否可以执行给定命令,然后WPF自动打开或关闭所有订阅界面元素。这使得创建响应式动态应用程序变得更加容易!
命令实际上并没有自己做任何事情。在根目录中,它们由ICommand接口组成,该接口仅定义一个事件和两个方法:Execute()和CanExecute()。第一个用于执行实际操作,而第二个用于确定操作当前是否可用。要执行命令的实际操作,您需要命令和代码之间的链接,这是CommandBinding发挥作用的地方。
CommandBinding通常在Window或UserControl上定义,并保存对它处理的Command的引用,以及用于处理Command的Execute()和CanExecute()事件的实际事件处理程序。
您当然可以实现自己的命令,我们将在下一章中介绍,但为了使您更容易,WPF团队已定义了100多个常用命令,您可以使用它们。它们分为5类,分别称为ApplicationCommands,NavigationCommands,MediaCommands,EditingCommands和ComponentCommands。特别是ApplicationCommands包含很多常用操作的命令,如New,Open,Save and Cut,Copy和Paste。
命令可帮助您使用单个事件处理程序响应来自多个不同来源的常见操作。它还使基于当前可用性和状态启用和禁用用户界面元素变得更加容易。这完全是理论,但在接下来的章节中,我们将讨论如何使用命令以及如何定义自己的自定义命令。