近段时间正在学习关于wpf框架的知识,学完关于命令的章节之后觉得有些困惑,在查阅了一些资料并做了一些试验后总结了一点对于命令的理解,在这里记录下来。
一、什么是命令
命令是对一系列鼠标和键盘动作的响应,简单来说的话可以把它当成是一种类似“事件”的机制,但与“事件”又存在一些不同之处,接下来将简单说说它们之间的不同之处在哪里。
二、与“事件”的对比
(1)响应动作的范围
相比于事件可以响应绝大多数鼠标与键盘事件,命令的响应范围比较狭隘。主要是以下两种(或许还有其它,但我目前所知道的只有两种)
1.响应鼠标点击事件。这是命令被绑定到按钮之后默认可以响应的鼠标动作。
2.响应特定的键盘动作。在定义命令时,通常会为命令定义快捷键,之后便可以通过特定的快捷键执行相应的命令
(2)命令处理函数的参数
相比于事件处理函数的参数的多样性(如MouseEventArgs和RoutedEventArgs等),命令触发的函数所接受的参数除去第一个和事件函数一样都是object外,另一个都是ExecutedRoutedEventArgs类型的参数。
(3)如何判定是否启用命令(事件)
事件一般无需额外的设置即可被触发(除非通过代码将整个按钮设置为不可用),但命令不同。当命令将要被触发前,会调用canExecute函数,并根据其返回值判定是否执行命令。这意味着可以随意地禁用和启用命令
三、关于命令的特色
说完了命令和事件的比较,接下来说说命令所特有的一些功能
1.预定义命令
通常来说,命令需要程序员自己来定义(这并不困难),但wpf提供了一个基本的命令库,保存了超过100条预定义命令,关于这些命令可以去查阅官方文档。
预定义命令除了可以节省一些用于定义命令的时间外,还提供了内置的命令事件代码,在特定的情况下,可以帮助程序员处理一些工作。比如当为button元素定义Cut命令并将其命令目标设置为一个textbox时,内置命令将省去编写相应命令事件代码的工作(当然这并不是唯一的使用内置命令代码的方法,关于更详细的内容同样可以在官方文档查到)
2.事件处理代码的统一
通常情况下,复杂的代码逻辑被放在一个专门的类中,事件处理代码一般负责调用已定义好的函数。在这种情况下,定义太多的事件处理代码便成了一种麻烦,特别是这些事件调用的都是同一个函数时。这时使用命令将这些触发事件的动作都导向同一个命令处理代码将更为明智。除去简化代码外,统一事件处理代码另一个好处是可以根据实际情况随心所欲地禁用或启用命令,这在“命令”未出现前是难以做到的,因为一旦事件多了之后,难保不会漏掉一两个。
以上便是我的一些思考,至于其他关于事件的冒泡还有命令目标等知识在msdn已经有了,这里不多赘述。