09_深入浅出话命令

备注:类关系结构图如下:

在这里插入图片描述

命令(Command)

命令和事件区别

事件的作用是发布传播一些消息,消息送达接受者,事件的使命也就完成了,至于如何响应,事件并不做规定,每个接受者可以使用自己的行为来响应事件。命令的区别在于命令具有约束力,约束代码结构、命名规则和步骤逻辑,类似接口和类的继承。

命令具体介绍
引入
  • WPF 命令系统由几个基本要素构成,他们是:
    • 命令(Command):WPF 的命令实际上就是实现了 ICommand 接口的类,平时使用最多的就是 RoutedCommand 类。
    • 命令源(Command Source):命令发送者,是实现了 ICommandSource 接口的类。很多界面元素都实现了这个接口,其中包括 Button、MenuItem、ListItem等。
    • 命令目标(Command Target):即命令作用在谁的身上,命令目标必须实现IInputElement 接口的类。
    • 命令关联(Command Binding):负责把一些外围逻辑与命令关联起来,比如之前执行对命令是否可以执行进行判断、命令执行之后还有哪些后续工作等。
  • 命令的使用大概分为以下几步:
  1. 创建命令类:即获取一个实现 ICommand 接口的类,如果命令与具体业务逻辑无关则使用 WPF 类库中的 RoutedCommand 类即可。如果想获得与业务逻辑相关的专有命令,则需要创建 RoutedCommand(或者 ICommand 接口)的派生类。
  2. 声明命令实例:一般程序中某种操作只需要一个命令实例与之对应即可,所以多使用单例模式。
  3. 指定命令源:当命令不能被执行的时候作为命令源的控件将出在不可用的状态,还有各种控件发送命令的方法不尽相同,有的是单击,有的是双击。
  4. 指定命令目标:如果没有为命令源指定命令目标,则 WPF 系统认为当前拥有焦点的对象就是命令目标。
  5. 设置命令关联:WPF 命令需要 CommandBinding 在执行之前来帮助判断是否可以执行,在执行之后做一些事情来“打扫战场”。
一个例子
  • 效果:定义一个命令,使用 Button 来发送这个命令,当命令到达 TextBox 时,TextBox 会被清空,如果 TextBox 没有文字,则命令不可以被发送。

  • 代码:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 备注:

    • private RoutedCommand clearCmd = new RoutedCommand("Clear", typeOf(Window1));这里就是创建命令类和声明命令实例,注意其中的 typeOf(Window1).
    • 注意命令源是 this.button1 命令目标是 this.textBoxA
    • 命令关联是安置在外围控件上。
  • 注意:

    • 使用命令可以避免自己写代码判断 Button 是否可用以及添加快捷键。
    • RoutedCommand 只是一个与业务逻辑无关的类,并不对命令目标做任何操作,TextBox 是 CommandBinding 清空的。
    • 无论是 命令是否执行、命令送达目标还是具体执行命令都会激发命令目标发送路由事件,这些路由事件会沿着 UI 元素树向上传递并最终被 CommandBinding 捕捉,本例中 CommandBinding 被安装在 StackPanel 上,站在高处起一个侦听器的作用。
    • 因为 CanExecute 事件的激发频率比较高,为了降低性能,在处理完后建议把 e.Handled 设为 true。
    • CommandBinding 一定要设置在命令目标的外围控件上,不然无法捕捉到 CanExecute 和Executed 等路由事件。
WPF 命令库

在这里插入图片描述
备注:其他几个命令库也与之相似,如果你的程序中需要诸如 Open、Save、Play、Stop 等标准命令,那就没必要自己声明,直接拿命令库来用就好了。

一个命令两处应用(命令参数)
  • 引入:新建一个档案 NEW ,但是可能新建 Teachr 档案,也可能新建 Student 档案。
  • 代码例子
    在这里插入图片描述
    在这里插入图片描述
    备注:
    • 此处新建命令是在 XAML 代码中写的,还比较简单,注意是否执行和执行还是要在后台 C# 中写。
    • 两个按钮都使用 NEW 命令,但是分别使用字符串 Teacher 和 Student 作为参数。
    • 控件的 Command 属性只有一个,而命令库中却有数十种命令,怎么可能使用这个唯一的 Cmomand 属性来调用这么多命令呢?
      <Button x:Name="dynamicCmdBtn" Command="{Binding Path=ppp, Source=sss}" Content="Command">
彻头彻尾的自定义命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

备注:

  • 为了讲解清晰才把命名声明放在这里,珍贵的方法应该是吧命名声明在静态全局的地方供所有对象使用。
  • 这个例子和前面命令的使用大概分为以下几步里面介绍的一致,注意区分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值