什么是WPF命令

概述

 

使用路由事件可响应广泛的鼠标和键盘动作,但是,事件是非常低级的元素,在实际应用程序中,功能被划分成一些高级的任务,这些任务可通过不同的动作和用户界面元素触发,包括主菜单,上下文菜单,键盘快捷键以及工具栏.可在WPF中定义这些任务–所谓的命令–并将控件连接到命令,从而不需要重复编写事件处理代码,更重要的是,当连接的命令不可用时,命令特性通过自动禁用控件来管理用户界面状态,命令模型还为存储和本地化命令的文本标题提供了一个中心场所.

 

什么是命令

 

在设计良好的windows应用程序中,应用程序逻辑不应位于事件处理程序中,而应在更高的方法中编写代码,其中的每个方法都代表单独的应用程序任务.每个任务可能依赖其他库

 

使用这种设计最明显的方式是在需要的地方添加事件处理程序,并使用各个事件处理程序调用恰当的应用程序方法,本质上,窗口代码变成一个精简的交换台,可以响应输入,并将请求转发到应用程序的核心.

 

尽管这种设计非常合理,但却没有减少任何工作,许多应用程序可通过各种不同的路由触发,所以经常需要编写多个事件处理程序来调用相同的应用程序方法,就其本身而言,这并不是什么问题,但当需要处理用户界面的状态时,问题就变复杂了.

 

下面通过一个简单的例子说明该问题,设想有一个程序,该程序包含了应用程序方法,可使用4中方式触发该方法:

(1)通过主菜单

(2)通过上下文菜单

(3)通过键盘快捷键

(4)通过工具栏按钮

 

在应用程序特定时刻,需要暂时禁用这个方法,这意味着需要禁用两个菜单命令和一个工具栏按钮,以使他们不能被单击,并且需要忽略快捷键.编写代码完成这项工作,可能会使不同状态的代码快不正确的相互重叠,从而导致不应该可用时被启用,编写和调试这类代码是windows开发中最枯燥的内容之一.

 

幸运的是,WPF使用新的命令模型帮助解决了这些问题,他增加了两个重要特性:

(1)将事件委托到适当的命令

(2)使控件的启用状态和相应命令的状态保持同步

 

WPF命令模型不像你所期望的那样直观,为了嵌入路由事件模型,需要几个单独元素,然而,命令模型在概念上非常简单.

 

WPF命令未解决的问题

 

虽然WPF命令系统是一款简化应用程序设计的优秀工具,但仍有一些很重要的问题没有解决,特别是,WPF对以下方面没有提供任何支持

(1)命令跟踪(例如,保留最近的命令历史)

(2)可撤销命令

(3)具有状态并处于不同模式的命令(例如,打开或关闭命令)