博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF自定义命令
阅读量:4685 次
发布时间:2019-06-09

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

  在实际的编程工作中,我们可以只是用事件,不用命令,程序的逻辑也一样被驱动的很好,但我们不能阻止程序员按照自己的习惯去写代码。比如保存事件的处理器,程序员们可以写Save()、Savehandler()、SaveDocument()...这些都符合代码规范,但是迟早有一天整个项目会变得无法读懂,新来的程序员或者修改bug的程序员会很抓狂。

WPF命令简介       

WPF的命令是实现了ICommand接口的类。ICommand接口非常简单,只包含两个方法和一个事件。

  • Execute方法:命令执行,或者说命令作用于目标之上。
  • CanExecute方法:在执行之前来弹指命令是否可被执行。
  • CanExecuteChanged事件:当命令执行状态发生改变时,可激发此事件来通知其他对象。

RoutedCommand就是这样一个实现了ICommand接口的类。RoutedCommand在实现ICommand接口时,并未向其中添加任何逻辑。

WPF的命令系统由几个基本元素构成,他们是:

  • 命令:WPF命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类。
  • 命令源:即命令的发送者,是实现了ICommandSource接口的类。
  • 命令目标:即命令将推送给谁,或者说命令将作用在谁身上。命令目标是必须实现了IInputElement接口的类。
  • 命令关联:负责把一些外围逻辑与命令关联起来,比如执行之前对命令是否可执行进行判断、命令执行后还有那些后续工作等。

 命令具有一处声明处处可用的特点,因此,MS在WPF类库里准备而来一些便捷的命令库,例如:

下面分别用WPF命令库,和自定义命令实现同样的功能。

WPF命令库命令   

Demo程序的UI如下:

后台代码如下:

using System.Windows;using System.Windows.Input;namespace WPFCommand{    ///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();        }        private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)        {            if (string.IsNullOrWhiteSpace(txtName.Text))            {                e.CanExecute = false;            }            else            {                e.CanExecute = true;            }        }        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)        {            string name = txtName.Text;            if (e.Parameter.ToString() == "Teacher")            {                listBox1.Items.Add("New Teacher: "+name);            }            if (e.Parameter.ToString() == "Student")            {                listBox1.Items.Add("New Student: "+name);            }        }    }}

程序的运行结果如下:

当txtName.Text为WhiteSpace时,命令不可被执行。

执行后效果如下:

前面说过不用命令,程序的逻辑也可以被驱动的很好。且在一般情况下,在程序中使用与逻辑无关的RoutedCommand来跑跑龙套也就足够了,上面这个命令用的就有十足的“酱油”的嫌疑。

 OK,把打酱油进行到底吧,下面自定义一个命令,实现相同的功能。

WPF自定义命令    

注意对比前面使用命令库命令的方法异同。

程序的UI如下:

后台代码如下:

using System.Windows;using System.Windows.Input;namespace MyCommand{    ///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        public MainWindow()        {            InitializeComponent();            //            InitCmd();        }        //声明并定义命令        private RoutedCommand newCmd=new RoutedCommand ("NewTS",typeof(MainWindow ));        private void InitCmd()        {                        //创建命令关联            CommandBinding cb = new CommandBinding();            cb.Command = newCmd;            cb.CanExecute += new CanExecuteRoutedEventHandler(CanExecute1);            cb.Executed += new ExecutedRoutedEventHandler(Executed1);            //把命令关联安置在外围控件上            mainWindow.CommandBindings.Add(cb);            //把命令赋值给命令源(发送者)            button1.Command = newCmd;            button2.Command = newCmd;        }        private void CanExecute1(object sender,CanExecuteRoutedEventArgs e)        {            //e.CanExecute = true;            if (string.IsNullOrWhiteSpace(txtName.Text))            {                e.CanExecute = false;            }            else            {                e.CanExecute = true;            }        }        private void Executed1(object sender, ExecutedRoutedEventArgs e)        {            string name = txtName.Text;            if (e.Parameter.ToString() == "Teacher")            {                listBox1.Items.Add("New Teacher: " + name);            }            if (e.Parameter.ToString() == "Student")            {                listBox1.Items.Add("New Student: " + name);            }        }    }}

程序的运行效果和上面的相同: 

当txtName.Text为WhiteSpace时,命令不可被执行。

执行后效果如下:

 

转载于:https://www.cnblogs.com/DebugLZQ/archive/2012/12/04/2800171.html

你可能感兴趣的文章
WPF 获取指定文件的Icon
查看>>
mysql实践(四)
查看>>
在linux服务器上配置anaconda和Tensorflow,并运行
查看>>
[POJ2823][洛谷P1886]滑动窗口 Sliding Window
查看>>
Flex 4.x 下载进度不出现问题解决办法
查看>>
Vue之自定义组件的v-model
查看>>
Vue项目碰到"‘webpack-dev-server’不是内部或外部命令,也不是可运行的程序或批处理文件"报错...
查看>>
解决Xcode在ipad/iphone 9.2 系统真机测试时出现could not find developer disk image问题
查看>>
基于asp.net的ajax分页
查看>>
分布式事务,两阶段提交协议,三阶段提交协议
查看>>
php/js获取客户端mac地址的实现代码
查看>>
float 在父元素为inline元素的情况
查看>>
git的基本使用
查看>>
MDK中编译程序后Program Size详解
查看>>
C++设计模式-Strategy策略模式
查看>>
MySQL中优化sql语句查询常用的30种方法
查看>>
字符流
查看>>
weight权重的属性
查看>>
Property和attribute的区别[转]
查看>>
iPhone4 手机应用相关
查看>>