来自《深入浅出WPF》(刘铁猛)读书笔记
WPF的命令系统有几个基本要素构成:
a)命令(Command):WPF的命令实际上就是实现了ICommand接口类;
b)命令源(Command Source):实现了ICommandSource接口类;
c)命令目标(Command target):实现了IInputElent接口类;
d)命令关联(Command Binding):负责把一些外围逻辑与命令关联起来。
命令的使用可以分为:
i)创建命令;
ii)声明命令实例;
iii)指定命令源;
iv)指定命令目标:如果没有为命令源指定命令目标,则WPF系统认为当前拥有焦点的对象就是命令目标;
v)设置命令关联:
实例:定义一个命令,使用Button来发送这个命令,当命令送达TextBox时TextBox会被清空,如果TextBox中没有文字则命令不可被发送。
在构造窗体函数中添加InitializeCommand():
private void InitializeComand() { //把命令赋给命令源(发送者)并指定快捷键 this.button1.Command=this.clearCmd; this.clearCmd.InputGestures.Add(new KeyGesture(Key.C,ModifierKeys.Alt)); //指定命令目标 this.button1.CommandTarget=this.textBoxA; //创建命令关联 CommandBinding cb=new CommandBinding(); cb.Command=this.clearCmd; cb.CanExecute+=new CanExecuteRoutedEventHandler(cb_CanExecute); cb.Executed+=new ExecutedRoutedEventHandler(cb_Executed); //把命令关联安置在外围控件上 this.stackPanel.CommandBindings.Add(cb);
在窗体中声明并定义命令:
private RoutedCommand clearCmd=new RoutedCommand("clear",typeof(Window1));
在窗体中定义:当探测命令是否可以执行时,此方法被调用
void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if(string.IsNullOrEmpty(this.textBoxA.Text)) {e.CanExecute=false;} else {e.CanExecute=true;} //避免继续向上传递而降低程序性能 e.Handled=true; }
当命令送到目标后,此方法被调用
void cb_Executed(object sender, ExecutedRoutedEventArgs e) { this.textBoxA.Clear(); //避免继续向上传递而降低程序性能 e.Hanldled=true; }
注意:
1)使用命令可以避免自己写代码判断Button是否可用及添加快捷键;
2)RoutedCommand是一个与业务逻辑无关的类,只负责在程序中跑腿而并不对命令目标做任何操作;
3)因为CanExecute事件的激发频率比较高,为了避免降低性能,在处理完后建议把e.Handled设为true;
4)CommandBinding一定要设置在命令目标的外围控件上,不然无法捕捉到CanExecute和Executed等路由事件。
命令具有“一处声明,处处使用”的特点。
WPF中包含一些便捷的命令库,如:ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands, MediaCommands, EditingCommands, 他们都是静态类,而命令就是用这些类的静态只读属性以单件模式保露出来的。
命令参数:CommandParameter--传递的实际消息的区分。
通过使用Binding,可以在只有一个Command的情况下,来调用控件的多种命令。