命令使用步骤:

创建命令类。创建一个实现ICommand接口的类,如果命令与具体业务逻辑无关,使用WPF类库中的RoutedCommand类即可。如果想得到与业务逻辑相关的专有命令,则需创建RoutedCommand或ICommand接口的派生类

声明命令实例。使用命令时需要创建命令类的实例。一般情况下,程序中的某种操作只需要一个命令实例与之对应即可,因此,程序中的命令多使用单件模式,以减少代码复杂度。

指定命令的源。同一个命令可以有多个源,一旦命令指派给命令源,那么命令源就会受命令的影响,当命令不能被执行的时候,作为命令源的控件将处于不可用的状态。

指定命令的目标。命令目标不是命令的属性,而是命令源的属性,被指定为命令源的组件,无论是否拥有焦点都会收到命令。如果没有指定目标,wpf默认当前拥有焦点的对象就是命令目标。

设置命令关联。无论命令目标是由程序员指定还是由WPF根据焦点所在判断出来的,一旦某个UI组件被命令源“瞄上”,命令源就会不断向命令目标投石问路,命令目标就会不停地发送可路由的PreviewCanExecute 和CanExecute附加事件,这两个事件会沿着UI元素树向上传递并被命令关联所捕捉,命令关联捕捉到这些事件后就会实时向命令报告是否能够发送。如果命令被发送出来,并到达命令目标,命令目标就会发送PreviewExecuted和Executed两个附加事件,这两个事件会沿着UI元素树传递并被命令关联捕捉,命令关联会完成一些后续的任务。

一、RoutedCommand

前端代码:

     <StackPanel Name="clearStackPanel"><StackPanel Orientation="Horizontal"><Button Name="clearButton" Content="Send Clear Text Command" Margin="5" /><Button Name="addButton" Content="Send Add Text Command" Margin="5" /></StackPanel><TextBox x:Name="beCleardeText" Height="80" Margin="5" Text="鸿雁长飞光不度,鱼龙潜跃水成文"/></StackPanel>

后端 :

        private RoutedCommand m_clearCmd=new RoutedCommand("Clear",typeof(CommandTab)); //RoutedCommand与业务逻辑无关private RoutedCommand m_addCmd = new RoutedCommand("Add", typeof(CommandTab));public CommandTab(){InitializeComponent();InitCommand();}private void InitCommand(){clearButton.Command = m_clearCmd; //命令赋值给命令源m_clearCmd.InputGestures.Add(new KeyGesture(Key.C, ModifierKeys.Alt)); //指定快捷键clearButton.CommandTarget = beCleardeText; //指定命令目标//创建命令关联CommandBinding cb = new CommandBinding();cb.Command = m_clearCmd;cb.CanExecute += cb_CanExecute;cb.Executed += Cb_Executed;clearStackPanel.CommandBindings.Add(cb); //命令关联安置在外围控件,不然无法捕捉CanExecute、Executed等路由事件addButton.Command = m_addCmd;m_addCmd.InputGestures.Add(new KeyGesture(Key.A, ModifierKeys.Alt));addButton.CommandTarget = beCleardeText;CommandBinding addCb=new CommandBinding();addCb.Command = m_addCmd;addCb.CanExecute += AddCb_CanExecute;addCb.Executed += AddCb_Executed;clearStackPanel.CommandBindings.Add(addCb);}private void Cb_Executed(object sender, ExecutedRoutedEventArgs e){beCleardeText.Clear();e.Handled = true;}private void cb_CanExecute(object sender, CanExecuteRoutedEventArgs e){if (string.IsNullOrEmpty(beCleardeText.Text))e.CanExecute = false;elsee.CanExecute = true;e.Handled = true;  //CanExecute激发频率较高,handled避免影响性能}private void AddCb_Executed(object sender, ExecutedRoutedEventArgs e){beCleardeText.Text = "山高月小,水落石出";e.Handled = true;}private void AddCb_CanExecute(object sender, CanExecuteRoutedEventArgs e){if (string.IsNullOrEmpty(beCleardeText.Text))e.CanExecute = true;elsee.CanExecute = false;e.Handled = true;}}

二、自定义Command

首先定义一个接口,约束命令的作用目标。每个需要接受命令的组件都要实现这个接口,确保命令可以成功地执行。

    public interface IView{void Clear();void Fill();}

其次,创建自定义命令,实现 ICommand接口。业务逻辑被引入到Execute方法中

    /// <summary>/// 作用于 IView派生类的填充命令/// </summary> public class FillCommand : ICommand{//命令可执行状态发生改变时被激发public event EventHandler? CanExecuteChanged;//用于判断命令是否可以执行public bool CanExecute(object? parameter){throw new NotImplementedException();}public void Execute(object? parameter){IView view =parameter as IView;if(view != null){view.Fill();}}}

然后,创建自己的命令源 ,需要实现 ICommandSource 接口

    /// <summary>/// 创建命令源/// </summary>public class MyCommandSource : UserControl, ICommandSource{public ICommand Command {get; set;}public object CommandParameter {get; set;}public IInputElement CommandTarget {get; set;}protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e){base.OnMouseLeftButtonUp(e);//在命令目标上执行命令if(CommandTarget != null){Command.Execute(CommandTarget);}}}

之后,创建命令目标,目标需实现 IView接口

界面:

<UserControl x:Class="WPF深入浅出.Controls.MiniView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:WPF深入浅出.Controls"mc:Ignorable="d" ><StackPanel><TextBox Name="text1" Margin="5" MinWidth="100" MinHeight="50" FontSize="20"/><TextBox Name="text2" Margin="5,0" MinWidth="100" MinHeight="50" FontSize="20"/></StackPanel>
</UserControl>

后端:

    public partial class MiniView : UserControl,IView{public MiniView(){InitializeComponent();}public void Clear(){text1.Clear();text2.Clear();}public void Fill(){text1.Text = "樱桃樊素口";text2.Text = "杨柳小蛮腰";           }}

最后,将命令、命令源和命令目标集成起来

界面:

    <Grid><StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"><controls:MiniView x:Name="miniView" Margin="5 50 5 40"/><StackPanel Orientation="Horizontal" HorizontalAlignment="Center"><wpf深入浅出:MyCommandSource x:Name="ctrlFill"><TextBlock Text="填充" FontSize="16" TextAlignment="Center" Background="LightGreen" Width="80" Margin="0 0 50 0"/></wpf深入浅出:MyCommandSource><wpf深入浅出:MyCommandSource x:Name="ctrlClear"><TextBlock Text="清除" FontSize="16" TextAlignment="Center" Background="LightGreen" Width="80"/></wpf深入浅出:MyCommandSource></StackPanel></StackPanel></Grid>

后端:

        private void InitCommand(){FillCommand fillCommand = new FillCommand();ctrlFill.Command = fillCommand;ctrlFill.CommandTarget = miniView;ClearCommand clearCommand = new ClearCommand();ctrlClear.Command = clearCommand;ctrlClear.CommandTarget = miniView;   }

todo:使用ICommand和 ICommandSource 的成员组成逻辑,通过Command的CanExecute方法返回值来影响命令源的状态

【WPF】命令 --《深入浅出WPF》相关推荐

  1. 《深入浅出WPF》笔记——事件篇

    如果对事件一点都不了解或者是模棱两可的话,建议先去看张子阳的委托与事件的文章(比较长,或许看完了,也忘记看这一篇了,没事,我会原谅你的)http://www.cnblogs.com/JimmyZhan ...

  2. 深入浅出WPF开发下载

    为什么要学习WPF? 许多朋友也许会问:既然表示层技术那么多,为什么还要推出WPF作为表示层技术呢?我们话精力学习WPF有什么收益和好处呢,这个问题我们从两个方面进行回答. 首先,只要开发表示层程序就 ...

  3. 深入浅出WPF(2)——解剖最简单的GUI程序

    深入浅出WPF(2)--解剖最简单的GUI程序 小序: 从这篇文章开始,我们进行XAML语言的上手学习.说实话,XAML这种语言一点也不难.如果把XML看成是"父类",那么XAML ...

  4. 《深入浅出WPF》笔记——绑定篇(一)

    上一节,有记录写到:在WPF里,数据驱动UI,数据占核心地位,UI次之.怎么恢复数据的核心地位,那就要先了解一下Binding. 一.Binding 基础 1.1WPF中Data Binding的带来 ...

  5. 《深入浅出WPF》系列视频(特辑)——MVVM入门与提高(难度300+)

    原文地址为: <深入浅出WPF>系列视频(特辑)--MVVM入门与提高(难度300+) <深入浅出WPF>系列视频(特辑)--MVVM入门与提高(难度300+) 一年多没有推出 ...

  6. 深入浅出WPF——什么是XAML

    深入浅出WPF--什么是XAML 小序: 还记得周星驰那句话吗?"人如果没有理想,那跟咸鱼有什么区别".当自己一步踏上追求理想的征途,才发现为了理想要放弃很多.很多--只有这时候才 ...

  7. 深入浅出WPF——XAML的优点

    深入浅出WPF--XAML的优点 正文: 2. XAML有哪些优点  前面一节已经向我们透露了XAML的几个优点: • XAML可以设计出专业的UI和动画--好用 • XAML不需要专业的编程知识,它 ...

  8. WPF(三) WPF 命令

    1.WPF 命令的概念 ​ WPF 区别于 WinForm,在继承WinForm熟悉的事件和委托技术之上,还提供了一套完善的命令(Command)系统.简单来说,命令是一个任务的完整封装,例如保存,复 ...

  9. [转]深入浅出WPF(7)——数据的绿色通道,Binding

    本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单--自己 ...

  10. 深入浅出WPF学习笔记之Binding

    深入浅出WPF之Binding Binding Binding基础 Binding模型 把控件作为Binding源与Binding标记扩展 Binding的(Path)路径 Binding支持多级路径 ...

最新文章

  1. 统计学习的三个招式:模型、策略和算法
  2. Linux 桌面的安装
  3. Cisco路由器安全配置命令
  4. 完美的项目从完美的表开始
  5. 关于 HTTP 的一切(HTTP/1.1,HTTP/2,HTTP/3,HTTPS, CORS, 缓存 ,无状态)
  6. excel数据库_EXCEL憋出大招,逆袭大数据的黑马出现了
  7. php单进程锁定,强制PHP命令行脚本单进程运行的方法
  8. pythonATM,购物车项目实战_补充1-结构图
  9. 易筋SpringBoot 2.1 | 第廿六篇:SpringBoot访问缓存抽象Cache
  10. html表格制作实战
  11. 唯物辩证法-矛盾论(普遍性+特殊性+斗争性+同一性)
  12. Introductory Combinatorics 5th Solutions Chapter1 summary
  13. HTTP Live Streaming直播(iOS直播)技术分析与实现
  14. “不用着急,慢慢来”,英语怎么说?
  15. 基于区域生长算法的图像分割python_基于区域分割(图像分割)
  16. 韩信点兵问题(C语言)
  17. Windows登录多微信
  18. java代码pdf转图片中文乱码解决
  19. 2022 年牛客多校第四场补题记录
  20. Google Chrome浏览器字体模糊,字体锯齿 的解决方法

热门文章

  1. STM32 串口通讯及实现
  2. java filenet_为FileNet P8组件集成器开发Java组件
  3. html5经典教程,40个经典HTML5实例教程.pdf
  4. Linux安装nat123步骤
  5. python实现单纯形法(大M法)
  6. 多个安卓设备投屏到电脑_安卓手机投屏到电脑上的三种方法
  7. KMP实现圆周率PI中找字串
  8. 11款免费而强大的PCB设计软件 还用什么AD PADS?
  9. 基于SSM框架的电影订票系统
  10. 2021级南航计算机专硕829备考记录