Commanding

        Commanding 是一个WPF概念,它在动作源如按钮和执行动作的目标如处理程序方法之间创建松散耦合。这个概念基于Gang ofFour中的命令模式。在WPF中,事件是紧密耦合的。编译包含事件的XAML代码,要求代码影藏已实现一个处理程序方法,且在编译期间可用。而对于命令,这个耦合是松散的。

要执行的动作命令对象定义。命令实现ICommand接口。WPF使用的命令类是RoutedCommand及其派生类RoutedUICommand.RoutedUICommand类定义一个ICcommand接口未定义的附加Text属性。这个属性可以在用户界面中用作文本信息。IXomand定义Execute()和CandExecute()方法,他们都在目标对象上执行。

命令源是调用命令的对象。命令源实现ICommandSource 接口。这种名流苑的例子有派生自Buttonbase的按钮类,Hyperlink和inputBinding.KeyBinding和MouseBinding是派生自InputBinding的类。命令源有一个Command属性,其中可以指定实现ICommand接口的命令对象。在使用控件如单机按钮式可,就会激活命令。

命令目标是实现了处理程序的对象,用于执行动作。通过命令绑定,定义一个映射,把处理程序映射到命令上。命令绑定指定在命令上调用哪个处理程序。命令绑定通过UIElement 类中实现的CommandBinding属性来定义。因此派生自UIElement的每个类都有CommandBinding 属性。这样,查找映射的处理程序就是一个层次化的过程。例如,在StackPanel中定义的一个按钮可以激活命令,而StackPanel位于ListBox中,Listbox位于Grid中。处理程序在该树型结构的么讴歌位置上通过命令绑定指定,如Window的命令绑定。下面修改BooksDemoRibbon 项目的实现方式,改为使用命令替代事件模型。

定义命令

        .net提供了返回预定义命令的类。ApplicationCommands 类定义了静态属性New,Open,Close,Print,Cut,Copy,Paste等。这些属性返回可用于特殊目的的RoutedUICommand对象。提供了命令的其他雷友NavigationCommands和MediaComands.NavigationCommands提供了用于导航的常见命令,如gotopage,nextpage和previouspage,mediacommand提供的命令可用用于运行媒体播放器,媒体播放器包含play,pause,stop,rewind,record等按钮。

定义执行应用程序域的特定动作的自动化命令并不难。为此,创建一个bookscommands类,它通过showbook和showbookslist属性返回一个Routeduicommand.也可以给命令指定一个输入手势,如keygesture或mousegesture,用alt修饰符定义b键。因为输入手势是命令源,所以按Alt+B组合键会调用该命令。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;namespace BooksDemo.Commands
{public static class BooksCommands{private static RoutedUICommand s_showBook;public static ICommand ShowBook => s_showBook ?? (s_showBook = new RoutedUICommand("Show Book",nameof(ShowBook), typeof(BooksCommands)));private static RoutedUICommand s_showBooksList;public static ICommand ShowBooksList{get{if(s_showBooksList==null){s_showBooksList = new RoutedUICommand("Show Books", nameof(ShowBooksList), typeof(BooksCommands));s_showBooksList.InputGestures.Add(new KeyGesture(Key.B, ModifierKeys.Alt));}return s_showBooksList;}}}
}

定义命令源

每个实现ICommandSource接口的类都可以是命令源,如button和MenuItem。在前面创建的功能区控件中,把Command属性赋予几个RibbonButton元素,例如快速访问工具栏,如下所示

            <Ribbon.QuickAccessToolBar><RibbonQuickAccessToolBar><RibbonButton SmallImageSource="Assets/one.png"Command="local:BooksCommands.ShowBook" /><RibbonButton SmallImageSource="Assets/list.png"Command="local:BooksCommands.ShowBooksList"/></RibbonQuickAccessToolBar></Ribbon.QuickAccessToolBar>

一些预定义的命令,例如ApplicationCommands.Cut,copy 和Paste 也赋予RibbonButton元素的Command属性,对于预定义的命令,使用简写表示法:

                <RibbonGroup Header="Clipboard"><RibbonButton Command="Paste" Label="Paste" LargeImageSource="Assets/paste.png" /><RibbonButton Command="Cut" SmallImageSource="Assets/cut.png" /><RibbonButton Command="Copy" SmallImageSource="Assets/copy.png" /><RibbonButton Command="Undo" LargeImageSource="Assets/undo.png" /></RibbonGroup>

命令绑定

        必须添加命令绑定,才能把他们连接到处理程序方法上。这里Window元素中定义命令绑定这样这些绑定就可用于窗口中的所有元素。执行ApplicationCommands.Close命令是,会调用OnClose()方法。执行BooksCommands.ShowBooks 命令是,会调用OnShowBooks()方法。

    <RibbonWindow.CommandBindings><CommandBinding Command="Close" Executed="OnClose"/><CommandBinding Command="commands:BooksCommands.ShowBooksList" Executed="OnShowBooksList"/></RibbonWindow.CommandBindings>

通过命令绑定,还可以指定CanExecute属性,在该属性中,会调用一个方法来验证命令是否可以用。例如,如果文件没有没变化,ApplicationCommands.Save命令就是不可用的。

需要用两个参数定义处理程序,它们分别是sender的object和可以从中访问命令信息的ExecutedRouteEventArgs

        private void OnClose(object sender, ExecutedRoutedEventArgs e){Application.Current.Shutdown();}

命令绑定也可以通过空间来定义。TextBox控件给ApplicationCommands.Cut,ApplicationCommands.Copy,ApplicationCommands.Paste,ApplicationCommands.Undo定义了绑定。这样,就只需要指定命令源,并使用TextBox控件中的已有功能。

WPF学习笔记16 BookDemo 2相关推荐

  1. WPF学习笔记(数据绑定篇3)

    接上回的<WPF学习笔记(数据绑定篇2)>,继续 BindValidation 此示例演示了: 如何使用错误模板: 使用样式显示错误信息: 如何在校验发生异常时执行回调: 首先,你可以看见 ...

  2. cocos2d-x学习笔记16:记录存储1:CCUserDefault

    cocos2d-x学习笔记16:记录存储1:CCUserDefault 一.简述 CCUserDefalt作为NSUserDefalt类的cocos2d-x实现版本,承担了cocos2d-x引擎的记录 ...

  3. SpringBoot学习笔记(16)----SpringBoot整合Swagger2

    Swagger 是一个规范和完整的框架,用于生成,描述,调用和可视化RESTful风格的web服务 http://swagger.io Springfox的前身是swagger-springmvc,是 ...

  4. WPF学习笔记(7):DataGrid中数字自定义格式显示

    WPF学习笔记(7):DataGrid中数字自定义格式显示 原文:WPF学习笔记(7):DataGrid中数字自定义格式显示 DataGrid中数据显示如下图,数据格式比较杂乱.希望达到以下要求:(1 ...

  5. Hadoop学习笔记—16.Pig框架学习

    Hadoop学习笔记-16.Pig框架学习 一.关于Pig:别以为猪不能干活 1.1 Pig的简介 Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin, ...

  6. 台大李宏毅Machine Learning 2017Fall学习笔记 (16)Unsupervised Learning:Neighbor Embedding

    台大李宏毅Machine Learning 2017Fall学习笔记 (16)Unsupervised Learning:Neighbor Embedding

  7. Linux 学习笔记16 信号量

    Linux 学习笔记16 信号量Semaphore 信号量概念 信号量(或信号灯)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. 信号量是控制进程(或线程)同步(谁先执行,谁后执行 ...

  8. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

  9. 区块链学习笔记16——ETH交易树和收据树

    区块链学习笔记16--ETH交易树和收据树 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 交易树和 ...

最新文章

  1. 【 MATLAB 】使用案例研究 DTFT 的对称性
  2. 三十四、多线程真的比单线程快?
  3. Java基础 Day14 泛型
  4. java编程中的持有对方引用是什么意思?有什么作用?
  5. 关于微信小程序的视频的坑
  6. python批量修改图片后缀名
  7. 【最全】BliBli,视频下载方法汇总!【最新】
  8. 基于单片机的数字万年历设计
  9. 结合量价持仓分析的股指期货日内交易策略
  10. 趋高机器视觉之机械手臂的应用
  11. 世界上第一台计算机论文,世界上公认的第一台电子计算机是1946年诞生。.doc
  12. 说话人识别(声纹识别)综述
  13. Linux内核源码阅读以及工具(转)
  14. Windows下WinRar创建自解压文件
  15. r910服务器增加内存,dellr910服务器硬件手册及安装方法
  16. RN系列之五十三解决Android上图片圆角的终级解决方案
  17. 《Building Simulation》期刊介绍(SCI 2区)
  18. ffmpeg音视频处理
  19. 大白兔启动盘做好后重做系统
  20. 发票查询,验证码无法刷新问题解决

热门文章

  1. 高斯求和问题(C语言程序设计)
  2. Word处理控件Aspose.Words功能演示:从 Java 中的 Word 文档中提取图像
  3. 梦幻西游服务器转移中暂时无法登陆,梦幻西游:转服常见问题答疑,赶紧先收藏起来,总会用到...
  4. 指标梳理对成功实施BI项目有什么意义
  5. java将前端传给后端的文字写入到word中
  6. 修改360浏览器主页
  7. elasticsearch集群管理插件之cerebro安装配置
  8. cerebro 通过https访问ES docker集群
  9. esp32 Flash分区与OTA功能简析
  10. 构造中小型园区网实训案例