wpf的command命令,wpf按钮绑定命令
作为春节前的最后一篇技术文章,该写什么?思考片刻后,让我们来谈谈WPF的命令。
指挥是一件有趣的事情。简单来说就是一种逻辑,但是这种逻辑可以被多个源调用,可以作用于多个目标。比如我们常见的“复制”、“剪切”等命令,它们本身就是逻辑3354操作剪贴板的一种逻辑行为。但是你会发现它们不仅可以用在菜单项中,也可以用在工具栏按钮上,还可以用快捷键Ctrl C等调用。
菜单项
工具栏按钮
从上面的例子可以发现,命令可以用功能相同的代码逻辑来泛化,就像我们封装一个类,可以在N个地方调用,这样就不用每次都写一样的代码了。
的。NET类库给我们准备了很多通用命令,很好用,这里就不说了。你可以参考MSDN的相关说明。本文的主题是自定义命令。在讲述自定义命令之前,首先要了解与命令相关的几个要素,就像我们常说的“叙事六要素”。一个完整的命令应该包括:
1.命令,这当然是最核心的部分;
2.命令来源:谁发出的命令;
3.目标,命令作用于哪些元素,比如将内容粘贴到textbox中,那么TextBox就是命令目标;
严格来说,命令是实现ICommand接口的类。但是,在国际使用中,我们不必这样做。一个有效的方法是在类中直接声明RouteCommand类的成员字段。一般情况下,使用Static关键字,这样命令只能与类相关,而不管它属于哪个实例。
接下来,我们一起来完成一个例子:
1.创建新的WPF应用程序。如何创建?(略);
2.布局主窗体。我们的重点是需要两个文本框和一个按钮,其他的我们喜欢;
3.使用CommadBinding将命令添加到form类的CommandBindings集合中。
4.设置按钮的命令属性。
在上面的XAML中,我们应该注意引入定义路由命令的类的名称空间。
接下来,我们将编写两个事件处理程序,——CanExecute,以确定命令是否可用;执行的命令逻辑应该写在这里。
所以我们会有一个疑问,事件的始作俑者是谁?目标是谁?
我们在已执行事件处理程序的开始处创建下一个断点,然后一步一步地跟随它。
结果如下:
发送方是主要形式。
ExecutedRoutedEventArgs的Source属性是命令目标。
然而,当我们运行它时,我们发现字体变成蓝色的不是文本框,而是按钮。为什么?
让我们仔细阅读MSDN文件和相关说明。因为我们没有设置目标,所以默认情况下,当前聚焦的元素将成为命令目标。
让我们更改上面的XAML,使按钮的CommandTarget指向第二个文本框。
现在运行它,您可以看到在单击按钮后,第二个文本框的前景色变成了蓝色。
CanExecute事件和Executed事件都是路由事件。当然,RouteCommand类也包含隧道事件。什么是路由事件,什么是隧道事件超出了本文的范围。
以路由事件为例,下面我们来做第二个例子。在这个例子中,表单上有一个StackPanel,其中包含一个按钮。同时,CommandBinding被添加到StackPanel中,并且一个DockPanel嵌套在StackPanel中。类似地,相同的命令被添加到包含画布的DockPanel中。但是Canvas不添加CommandBinding,然后输出所引发事件的类型的Name属性的值,命令目标类型和执行的事件处理程序中的目标。
[XAML]
然后,我们运行程序,依次点击这三个按钮,然后打开“输出”窗口进行观察。
结果如下:
你发现了什么?从调试信息可以看出,后两个命令引起的事件类型都是DockPanel,这也符合路由事件冒泡可视化树的原理。
因为我们在Canvas中没有绑定命令,所以我们不能在Canvas上引发事件,所以我们向上路由到DockPanel,所以最后两个事件的触发器是DockPanel。
接下来,我们将做第三个例子,它是由快捷键Ctrl Alt Y而不是控件激活的。
运行程序,当窗口处于活动状态时,再按Ctrl+Alt+Y,就可以看到效果了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。