博客
关于我
wpf-基础-命令-基础知识
阅读量:751 次
发布时间:2019-03-15

本文共 3014 字,大约阅读时间需要 10 分钟。

参考的是书籍《深入浅出WPF》。运行环境:win10+vs2019。除某些截图中的代码外,其他均已本地测试通过。

目录

基础知识

命令具有约束性,事件没有。

命令可以约束代码,约束步骤逻辑,方便debug。

命令的基本要素

  1. 命令Command:wpf的命令是实现了ICommand接口的类,最常用的是RoutedCommand类(命令与业务逻辑无关时使用,如果想得到与业务逻辑有关的专有命令,则需要创建RoutedCommand的派生类)
  2. 命令源Command Source:命令的发送者,实现了ICommandSource接口。很多界面元素(Button/MenuItem/ListBoxItem等)都实现了这个接口。
  3. 命令目标Command Target:命令的接收者,实现了IInputElement接口。
  4. 命令关联Command Binding:负责把一些外围逻辑与命令关联起来,如执行前对命令是否可以执行进行判断、命令执行后还有哪些后续工作等。

命令的使用步骤

  1. 创建命令类
  2. 声明命令实例:一般情况下程序中某种操作只需要一个命令实例与之对应,比如“保存”这个操作,可以用同一个实例命令每个组件执行其保存功能,因此程序中的命令多使用Singleton Pattern以减少代码复杂度。
  3. 指定命令的源:同一个命令可以有多个源。一旦把命令指派给命令源,那么当命令不能被执行的时候,作为命令源的控件将出于不可控状态。各种控件发送命令的方法不一样,如Button和MenuItem都是在单击时发送命令,而ListBoxItem单击时表示被选中,所以双击时才能发送命令。
  4. 指定命令目标:命令目标是命令源的属性。如果没有为命令源指定命令目标,则wpf系统认为当前拥有焦点的对象就是命令目标。
  5. 设置命令关联:CommandBinding
    无论命令目标是否已指定,一旦某个UI组件被命令源瞄准,命令源就会不停地向命令目标“投石问路”,命令目标就会不停地发送出可路由的PreviewCanExecute和CanExecute附加事件,事件会沿着UI元素树向上传递并被命令关联所捕捉。命令关联捕捉到这些事件后会把命令能不能发送实时报告给命令。如果命令到达命令目标,命令目标就会发送PreviewExecuted和Executed两个附加事件,最后被命令关联捕捉,命令关联接着会完成一些后续任务。对于那些与业务逻辑无关的通用命令,后续任务是非常重要的。

PreviewCanExecute/CanExecute/PreviewExecuted/Executed都是附加事件,是被CommandManager类附加给命令目标的。前两个执行事件是不受程序猿控制的。

实例:有内容时清空TextBox否则不可用

定义一个命令,使用Button发送,当命令到达TextBox时TextBox会被清空。如果TextBox中没有文字,则命令不可被发送。

开始时因为TextBox是空的,所以按钮被禁用。

在这里插入图片描述
TextBox有东西之后,按钮可用。点击按钮后,清空,按钮恢复不可用:
在这里插入图片描述
前台

后台

using System.Windows.Input;namespace pxy{    ///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();            InitializeCommand();              }                private RoutedCommand clearCmd = new RoutedCommand("Clear", typeof(MainWindow));                private void InitializeCommand() {            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; // 只关注与clearCmd相关的事件            cb.CanExecute += new CanExecuteRoutedEventHandler(cb_CanExecute);            cb.Executed += new ExecutedRoutedEventHandler(cb_Executed);            // 必须把命令关联安置到外围控件上            this.stackPanel.CommandBindings.Add(cb);        }                void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e)        {            // 如果TextBox时空的            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.Handled = true;        }    }    }

wpf命令库

包括ApplicationCommands/ComponentCommands/NavigationCommands/MediaCommands/EditingCommands,都是静态类。命令都是这些类的静态只读属性。仍然是单例模式。 如果程序中需要例如Open/Save/Play/Stop等标准命令的话,就不用自己声明了,直接使用命令库。

在这里插入图片描述
【这里以后再补充吧。。。】

转载地址:http://nmelz.baihongyu.com/

你可能感兴趣的文章
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS UC 2013-0-Prepare Tool
查看>>