首页 > 代码库 > 八,WPF 命令

八,WPF 命令

  1. WPF命令模型
    ICommand接口
    WPF命令模型的核心是System.Windows.Input.ICommand接口,该接口定义了命令的工作原理,它包含了两个方法和一个事件:
    public interface ICommand{    void Execute(object parameter);         //定义在调用此命令时调用的方法。    bool CanExecute(object parameter);      //此方法返回命令的状态,如果命令可用则返回true,否则返回false.    event EventHandler CanExecuteChanged;   //当命令状态改变时,引发该事件。}

    RoutedCommand类
    当创建自己的命令时,不会直接实现ICommand接口,而是使用System.Windows.Input.RoutedCommand类。它是WPF中唯一实例了ICommand接口的类,它为事件冒泡和隧道添加了一些额外的基础结构。为了支持路由事件,RoutedCommand类私有地实现了ICommand接口,并且添加了ICommand接口方法的一些不同的版本,最明显的变化是,Execute()和CanExecute()方法使用了一个额外参数。代码示例如下:

    public void Execute(object parameter, IInputElement target){ }
    public bool CanExecute(object parameter, IInputElement target){ }

    参数target是开始处理事件的元素,事件从target元素开始,然后冒泡至高层的容器,直到应用程序为了执行合适的任务而处理了事件。
    RoutedCommand类还引入了三个属性:Name(命令名称)、OwnerType(包含命令的类)及InputGestures集合(可以被用于触发命令的按键或鼠标操作)。

    RoutedUICommand类
    RoutedUICommand类只增加了一个属性 Text,它是命令显示的文本。在程序中处理的大部分命令不是RoutedCommand对象,而是RoutedUICommand类的实例,RoutedUICommand类继承自RoutedCommand类。而WPF提供的所有预先构建好的命令都是RoutedUICommand对象。RoutedUICommand类用于具有文本的命令,这些文本显示在用户界面中的某些地方(如菜单项文本,工具栏按钮的工具提示)。
    命令库
    因为每个应用程序可能都有大量的命令,且对于许多不同的应用程序,很多命令是通用的,为了减少创建这些命令所需要的工作,WPF提供了一个基本命令库,这些命令通过以下5个专门的静态类的静态属性提供:
    QQ图片20140805000636
    许多命令对象都是有一个额外的特征:默认输入绑定,例如,ApplicationCommands.Open命令被映射到Ctrl+O组合键,只要将命令绑定到一个命令源,并为窗口添加该命令源,这个组合键就会被激活,即使没有在用户界面的任何地方显示该命令也同样如此。
  2. 命令源
    命令源是一个实现了ICommandSource接口的控件,它定义了三个属性:
    QQ图片20140805002559
    例如,下面的按钮使用Command属性连接到ApplicationCommands.New命令:

    且可以使用如下的缩写形式,因为WPF足够智能,它能够解析到WPF命令库中的所有命令: