博客
关于我
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 CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>