博客
关于我
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/

你可能感兴趣的文章
MySQL-数据页的结构
查看>>
MySQL-架构篇
查看>>
MySQL-索引的分类(聚簇索引、二级索引、联合索引)
查看>>
Mysql-触发器及创建触发器失败原因
查看>>
MySQL-连接
查看>>
mysql-递归查询(二)
查看>>
MySQL5.1安装
查看>>
mysql5.5和5.6版本间的坑
查看>>
mysql5.5最简安装教程
查看>>
mysql5.6 TIME,DATETIME,TIMESTAMP
查看>>
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>