WPF-15:命令-1

来自《深入浅出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的情况下,来调用控件的多种命令。

猜你喜欢

转载自blog.csdn.net/huan_126/article/details/80108139
今日推荐