wpf 命令概述

wpf 命令概述

命令是 Windows Presentation Foundation (WPF) 中的一种输入机制,与设备输入相比,它提供的输入处理更侧重于语义级别。 示例命令如许多应用程序均具有的“复制”、“剪切”和“粘贴”操作。

本概述定义 WPF 中有哪些命令、哪些类属于命令模型以及如何在应用程序中使用和创建命令。

1.什么是命令

命令具有多个用途。 第一个用途是分隔语义和从执行命令的逻辑调用命令的对象。 这可使多个不同的源调用同一命令逻辑,并且可针对不同目标自定义命令逻辑。 例如,许多应用程序中均有的编辑操作“复制”、“剪切”和“粘贴”若通过使用命令来实现,那么可通过使用不同的用户操作来调用它们。 应用程序可允许用户通过单击按钮、选择菜单中的项或使用组合键(例如 Ctrl+X)来剪切所选对象或文本。 通过使用命令,可将每种类型的用户操作绑定到相同逻辑。

命令的另一用途是指示操作是否可用。 继续以剪切对象或文本为例,此操作只有在选择了内容时才会发生作用。 如果用户在未选择任何内容的情况下尝试剪切对象或文本,则不会发生任何操作。 为了向用户指示这一点,许多应用程序通过禁用按钮和菜单项来告知用户是否可以执行某操作。 命令可以通过实现 CanExecute 方法来指示操作是否可行。 按钮可以订阅 CanExecuteChanged 事件,如果 CanExecute 返回 false 则禁用,如果 CanExecute 返回 true 则启用。

虽然命令的语义在应用程序和类之间可保持一致,但操作的逻辑特定于操作所针对的特定对象。 组合键 Ctrl+X 调用文本类、图像类和 Web 浏览器中的“剪切”命令,但执行“剪切”操作的实际逻辑由执行剪切的应用程序定义。 RoutedCommand 使客户端实现逻辑。 文本对象可将所选文本剪切到剪贴板,而图像对象则剪切所选图像。 应用程序处理 Executed 事件时可访问命令的目标,并根据目标的类型采取相应操作。

2.WPF 中的简单命令示例

使用 WPF 中命令的最简单的方式是使用某一个命令库类中预定义的 RoutedCommand使用具有命令处理本机支持的控件,以及使用具有命令调用本机支持的控件。 Paste 命令是 ApplicationCommands 类中的预定义命令之一。 TextBox 控件含有用于处理 Paste 命令的内置逻辑。 MenuItem 类具有调用命令的本机支持。

以下示例显示了如何设置 MenuItem,以便在单击时它将调用 TextBox 上的 Paste 命令,假定 TextBox 具有键盘焦点。

<StackPanel><Menu><MenuItem Command="ApplicationCommands.Paste" /></Menu><TextBox />
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;

3.WPF 命令中的四个主要概念

WPF 中的路由命令模型可分解为四个主要概念:命令、命令源、命令目标和命令绑定:

  • 命令是要执行的操作。
  • 命令源是调用命令的对象。
  • 命令目标是在其上执行命令的对象。
  • 命令绑定是将命令逻辑映射到命令的对象。

在前面的示例中,Paste 命令是命令,MenuItem 是命令源,TextBox 是命令目标,命令绑定由 TextBox 控件提供。 值得注意的是,CommandBinding 并不总是由作为命令目标类的控件提供。 通常,CommandBinding 必须由应用程序开发者创建,否则 CommandBinding 可能会附加到命令目标的上级元素。

1. 命令

WPF 中的命令是通过实现 ICommand 接口创建的。 ICommand 公开了两种方法 ExecuteCanExecute,以及一个事件 CanExecuteChanged

  • Execute 执行与该命令关联的操作。
  • CanExecute 确定是否可以在当前命令目标上执行该命令。
  • 如果集中管理命令操作的命令管理器检测到命令源中存在一个可能使已引发命令无效但尚未由命令绑定执行的更改,则会引发
    CanExecuteChanged

ICommand 的 WPF 实现是 RoutedCommand 类,并且是本概述的重点。

WPF 中输入的主要源是鼠标、键盘、墨迹和路由命令。 面向设备程度更高的输入使用 RoutedEvent 通知应用程序页中的对象输入事件已发生。 RoutedCommand 也不例外。 RoutedCommand 的 Execute 和 CanExecute 方法不包含该命令的应用程序逻辑,而是引发通过元素树通行和浮升的路由事件,直到遇到具有 CommandBinding 的对象。 CommandBinding 包含这些事件的处理程序,命令正是由这些处理程序执行。 有关 WPF 中事件路由的详细信息,请参阅路由事件概述。

RoutedCommand 上的 Execute 方法引发命令目标上的 PreviewExecuted 和 Executed 事件。
RoutedCommand 上的 CanExecute 方法引发命令目标上的 CanExecute 和 PreviewCanExecute 事件。
这些事件通过元素树通行和浮升,直到遇到一个具有针对该特定命令的 CommandBinding 的对象。

WPF 提供了分布在几个类中的一组常用路由命令:MediaCommands、ApplicationCommands、NavigationCommands、ComponentCommands 和 EditingCommands。 这些类仅由 RoutedCommand 对象构成,而不包含命令的实现逻辑。 实现逻辑由在其上执行命令的对象负责。

2.命令源

命令源是调用命令的对象。 命令源的示例有 MenuItem、Button 和 KeyGesture。

WPF 中的命令源通常实现 ICommandSource 接口。

ICommandSource 公开三个属性:Command、CommandTarget 和 CommandParameter:

  • Command 是在调用命令源时执行的命令。
  • CommandTarget 是要执行命令的对象。 值得注意的是,在 WPF 中,仅当 ICommand 为 RoutedCommand
    时,ICommandSource 上的 CommandTarget 属性才适用。 如果在 ICommandSource 上设置
    CommandTarget 并且相应的命令不是 RoutedCommand,则忽略命令目标。 如果未设置
    CommandTarget,则具有键盘焦点的元素将成为命令目标。
  • CommandParameter 是用于将信息传递给实现命令的处理程序的用户定义数据类型。

实现 ICommandSource 的 WPF 类是 ButtonBase、MenuItem、Hyperlink 和 InputBinding。 单击 ButtonBase、MenuItem 和 Hyperlink 时,调用一个命令,当执行与其关联的 InputGesture 时,InputBinding 调用命令。

以下示例显示如何将 ContextMenu 中的 MenuItem 用作 Properties 命令的命令源。

<StackPanel><StackPanel.ContextMenu><ContextMenu><MenuItem Command="ApplicationCommands.Properties" /></ContextMenu></StackPanel.ContextMenu>
</StackPanel>
StackPanel cmdSourcePanel = new StackPanel();
ContextMenu cmdSourceContextMenu = new ContextMenu();
MenuItem cmdSourceMenuItem = new MenuItem();// Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu;
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem);// Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties;

通常,命令源将侦听 CanExecuteChanged 事件。 此事件通知命令源在当前命令目标上执行命令的能力可能已发生更改。 命令源可以使用 CanExecute 方法查询 RoutedCommand 的当前状态。 如果命令无法执行,命令源可禁用自身。 此情况的一个示例是 MenuItem,在命令无法执行时,它自身将灰显。

InputGesture 可以用作命令源。 WPF 中的两种输入笔势是 KeyGesture 和 MouseGesture。 可以将 KeyGesture 视为键盘快捷方式,例如 Ctrl+C。 KeyGesture 由一个 Key 和一组 ModifierKeys 组成。 MouseGesture 由 MouseAction 和一组可选的 ModifierKeys 组成。

为了将 InputGesture 用作命令源,它必须与一个命令相关联。 可通过几种方式来实现此目的。 其中一种方法是使用 InputBinding。

以下示例演示如何在 KeyGesture 和 RoutedCommand 之间创建 KeyBinding。

<Window.InputBindings><KeyBinding Key="B"Modifiers="Control" Command="ApplicationCommands.Open" />
</Window.InputBindings>
KeyGesture OpenKeyGesture = new KeyGesture(Key.B,ModifierKeys.Control);KeyBinding OpenCmdKeybinding = new KeyBinding(ApplicationCommands.Open,OpenKeyGesture);this.InputBindings.Add(OpenCmdKeybinding);

将 InputGesture 关联到 RoutedCommand 的另一种方法是将 InputGesture 添加到 RoutedCommand 上的 InputGestureCollection。

以下示例演示如何将 KeyGesture 添加到 RoutedCommand 的 InputGestureCollection 中。

KeyGesture OpenCmdKeyGesture = new KeyGesture(Key.B,ModifierKeys.Control);ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture);

3.CommandBinding

CommandBinding 将命令与实现该命令的事件处理程序相关联。

CommandBinding 类包含 Command 属性,及 PreviewExecuted、Executed、PreviewCanExecute 和 CanExecute 事件。

Command 是与 CommandBinding 关联的命令。 附加到 PreviewExecuted 和 Executed 事件的事件处理程序实现命令逻辑。 附加到 PreviewCanExecute 和 CanExecute 事件的事件处理程序确定是否可以在当前命令目标上执行该命令。

以下示例演示如何在应用程序的根 Window 上创建 CommandBinding。 CommandBinding 将 Open 命令与 Executed 和 CanExecute 处理程序关联。

<Window.CommandBindings><CommandBinding Command="ApplicationCommands.Open"Executed="OpenCmdExecuted"CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(ApplicationCommands.Open,OpenCmdExecuted,OpenCmdCanExecute);this.CommandBindings.Add(OpenCmdBinding);

将 CommandBinding 附加到特定对象,例如应用程序或控件的根 Window。 CommandBinding 附加到的对象定义了绑定的范围。 例如,附加到命令目标的上级元素的 CommandBinding 可以通过 Executed 事件到达,但无法到达附加到命令目标的下级元素的 CommandBinding。 其直接原因在于 RoutedEvent 从引发事件的对象通行和浮升的方式。

在某些情况下,CommandBinding 会附加到命令目标本身,例如 TextBox 类及 Cut、Copy 和 Paste 命令。 然而,很多时候将 CommandBinding 附加到命令目标的上级元素(例如主要 Window 或应用程序对象)会更加方便,尤其是在同一 CommandBinding 可用于多个命令目标时。 这是在创建命令基础结构时需要考虑的设计决策。

4.命令目标

命令目标是在其上执行命令的元素。 关于 RoutedCommand,命令目标是 Executed 和 CanExecute 的路由开始的元素。 如前所述,在 WPF 中,仅当 ICommand 为 RoutedCommand 时,ICommandSource 上的 CommandTarget 属性才适用。 如果在 ICommandSource 上设置 CommandTarget 并且相应的命令不是 RoutedCommand,则忽略命令目标。

命令源可以显式设置命令目标。 如果未定义命令目标,则具有键盘焦点的元素将用作命令目标。 将具有键盘焦点的元素用作命令目标的一个好处在于,这样可使应用程序开发者能够使用同一命令源在多个目标上调用命令,而无需跟踪命令目标。 例如,如果 MenuItem 在具有 TextBox 控件和 PasswordBox 控件的应用程序中调用“Paste”命令,则目标可以是 TextBox 或 PasswordBox,具体取决于哪个控件具有键盘焦点。

以下示例演示如何在标记和代码隐藏中显式设置命令目标。

<StackPanel><Menu><MenuItem Command="ApplicationCommands.Paste"CommandTarget="{Binding ElementName=mainTextBox}" /></Menu><TextBox Name="mainTextBox"/>
</StackPanel>
// Creating the UI objects
StackPanel mainStackPanel = new StackPanel();
TextBox pasteTextBox = new TextBox();
Menu stackPanelMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();// Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem);
mainStackPanel.Children.Add(stackPanelMenu);
mainStackPanel.Children.Add(pasteTextBox);// Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste;// Setting the command target to the TextBox
pasteMenuItem.CommandTarget = pasteTextBox;

CommandManager

CommandManager 提供许多与命令相关的函数。 它提供了一组静态方法,用于在特定元素中添加和删除 PreviewExecuted、Executed、PreviewCanExecute 和 CanExecute 事件处理程序。 它提供了将 CommandBinding 和 InputBinding 对象注册到特定类的方法。 CommandManager 还通过 RequerySuggested 事件提供了一种方法,用于在应引发 CanExecuteChanged 事件时通知命令。

InvalidateRequerySuggested 方法强制 CommandManager 引发 RequerySuggested 事件。 这在应禁用/启用命令的情况下非常有用,但对于 CommandManager 可识别的情况,则不太有用。

4.命令库

WPF 提供一组预定义命令。 命令库包括以下类:ApplicationCommands、NavigationCommands、MediaCommands、EditingCommands 和 ComponentCommands。 这些类提供诸如 Cut、BrowseBack、BrowseForward、Play、Stop 和 Pause 的命令。

许多这些命令都包含一组默认输入绑定。 例如,如果指定应用程序处理复制命令,则可自动获取键盘绑定“CTRL+C”。此外,还可获得其他输入设备的绑定,例如 Tablet PC 笔势和语音信息。

使用 XAML 引用各个命令库中的命令时,通常可省略公开静态命令属性的库类的类名。 一般来说,命令名称是明确作为字符串的,且存在所属类型来提供命令的逻辑分组,不过对于消除二义性这并不必要。 例如,可指定 Command=“Cut” 而不是更为冗长的 Command=“ApplicationCommands.Cut”。 这是针对命令内置于 WPF XAML 处理器中的便捷机制(更准确地说,它是 WPF XAML 处理器在加载时所引用的 ICommand 的类型转换器行为)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据分析的流程:CRISP-DM方法和SEMMA方法

CRISP-DM方法 SEMMA方法 角色与职责&#xff1a;EDIT数字化模型

分布式事务的用途是什么?分布式事务产生的情景有哪些?分布式事务的解决方案和思路

分布式事务&#xff0c;指的就是在分布式的系统里面完成一些事务&#xff0c;下文介绍了分布式事务的用途是什么&#xff1f;分布式事务产生的情景有哪些等问题。 一、分布式事务的用途是什么&#xff1f; 分布式事务处理 (TP) 系统旨在协助在分布式环境中跨异类的事务识别资…

基于STM32+微信小程序设计的智能宠物喂养系统_2023升级版

基于STM32设计的智能宠物喂养系统(腾讯云IOT+微信小程序) 一、设计需求 【1】 项目背景 随着生活水平的提高,人们的生活节奏越来越快,无法照顾宠物的人群越来越多。而宠物的健康和幸福是人们非常关心的问题。为了解决这个问题,人们开始使用智能投喂器来帮助宠物。然而,传…

VMware 虚拟机开启后黑屏问题的解决方式

很好&#xff0c;现在是vm 虚拟机节目的连续剧了 首先&#xff0c;我们安装好了&#xff0c;vm软件。 其次&#xff0c;我们在vm中创建了虚拟机。 再其次&#xff0c;我们解决了&#xff0c;开启虚拟机计算机自动重启的问题。 最后我们遇到了这个问题&#xff1a;虚拟机开启后整…

软路由R4S+iStoreOS实现公网远程桌面局域网内电脑

软路由R4SiStoreOS实现公网远程桌面局域网内电脑 文章目录 软路由R4SiStoreOS实现公网远程桌面局域网内电脑简介 一、配置远程桌面公网地址配置隧道 二、家中使用永久固定地址 访问公司电脑具体操作方法是&#xff1a;2.1 登录页面2.2 再次配置隧道2.3 查看访问效果 简介 上篇…

Linux C 进程编程

进程编程 进程介绍进程的定义进程和线程以及程序的区别进程块PCB进程的状态相关指令 进程调度算法先来先服务调度算法 FCFS短作业(进程)优先调度算法 SJF优先权调度算法 FPF优先权调度算法的类型非抢占式优先权算法抢占式优先权算法 优先权类型静态优先权动态优先权 高响应比优…

图论13-最小生成树-Kruskal算法+Prim算法

文章目录 1 最小生成树2 最小生成树Kruskal算法的实现2.1 算法思想2.2 算法实现2.2.1 如果图不联通&#xff0c;直接返回空&#xff0c;该图没有mst2.2.2 获得图中的所有边&#xff0c;并且进行排序2.2.2.1 Edge类要实现Comparable接口&#xff0c;并重写compareTo方法 2.2.3 取…

苹果上架要用中文吗?

苹果公司对在App Store上发布的应用程序有严格的规定。在App Store的审查过程中&#xff0c;所有提交的应用程序必须遵守苹果的App Store规范。 根据苹果的App Store规范&#xff0c;应用程序的名称和描述必须使用英文&#xff0c;并且不能包含中文字符。这是因为苹果的App St…

ES6 导入导出

ES6 导入导出 ES6引入了原生的模块化支持&#xff0c;使得JavaScript代码可以被划分为可重用的模块。这些模块可以导出部分代码&#xff08;如函数、对象、类等&#xff09;&#xff0c;并被其他模块导入使用。 export 命名导出&#xff08;Named Exports&#xff09; 可以从…

VR全景技术在城市园区发展中有哪些应用与帮助

引言&#xff1a; 在数字化时代的浪潮中&#xff0c;虚拟现实&#xff08;VR&#xff09;全景技术逐渐融入各个领域&#xff0c;也为城市园区展示带来了全新的可能性。 一&#xff0e;VR全景技术简介 虚拟现实全景技术是一种通过全景图像和视频模拟真实环境的技术。通过相关设…

【极客时间-系列教程】Vim 实用技巧必知必会-更多常用命令:应对稍复杂的编辑任务

文章目录 更多常用命令&#xff1a;应对稍复杂的编辑任务光标移动文本修改文本对象选择 更多常用命令&#xff1a;应对稍复杂的编辑任务 几个基本的命令已经了解了&#xff0c;可以操作简单的任务&#xff0c;但一些很复杂的命令&#xff0c;并没有了解到&#xff0c;只知道几…

每天一点python——day67

#每天一点Python——67 #字符串判断方法&#xff1a;如图&#xff1a; #①判断指定字符串是否为合法标识符 shello,computer print(s.isidentifier()) #输出为False&#xff0c;不是合法标识符&#xff0c;这是因为标识符是由字母&#xff0c;数字&#xff0c;下划线组成&#…

【C++】new和delete深度解析

文章目录 一、new/delete是什么&#xff1f;1.new2.delete 二、new/delete怎么用&#xff1f;1.new2.delete3.new[]4.[]delete 三、new/delete为什么&#xff1f;1.为什么有operator new/operator delete?2.为什么要匹配使用new和delete? new/delete测试环境&#xff1a;visu…

线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第二篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克…

海上船舶交通事故VR模拟体验低成本高效率-深圳华锐视点

在海上运输行业&#xff0c;安全事故的防范和应对能力是企业安全教育的重中之重。针对这一问题&#xff0c;海上运输事故VR模拟逃生演练成为了一种创新且高效的教育手段。通过这种演练&#xff0c;企业能够在提升员工安全意识和技能方面获得多方面的帮助。 在VR船舶搜救演练中&…

鸿蒙原生应用开发-元服务分发方式的调整及趋势

元服务上架审核通过后&#xff0c;会收到邮件通知&#xff0c;但此时还无法搜索到上架的元服务&#xff0c;需要华为进行配置后&#xff0c;才能让元服务露出。当前&#xff0c;元服务分发的主要渠道有&#xff1a; 1.应用市场&#xff1a;具备搜索能力&#xff0c;在搜索结果的…

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取(通过UART串口来控制模块)

基于RFbeam的V-LD1-60GHz毫米波雷达传感器数据获取&#xff08;通过UART串口来控制模块&#xff09; 文章目录 V-LD1命令发送消息回复通信示例雷达数据获取宏定义通信代码运行效果附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转…

详情API接口上货搬运获取信息API接口

一、拼多多详情API接口概述 拼多多详情API接口是拼多多开放平台提供的一套接口&#xff0c;用于获取商品详情信息&#xff0c;包括商品标题、描述、价格、库存等。通过该接口&#xff0c;商家可以快速获取商品信息&#xff0c;并自由组合、定制&#xff0c;以实现个性化的详情…

将自己的代码封装成python库

创建自己的 Python 库并发布供他人使用&#xff0c;主要分以下几步&#xff1a; 1.创建你的项目结构&#xff1a;这通常包括一个包含你的代码的 src 目录&#xff0c;一个测试目录&#xff0c;一个用于描述你的项目的 README.md 文件&#xff0c;一个 setup.py 文件&#xff0…

【广州华锐视点】海外制片人VR虚拟情景教学带来全新的学习体验

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种利用电脑模拟产生一个三维的虚拟世界&#xff0c;提供用户关于视觉、听觉、触觉等感官的模拟体验的技术。随着科技的进步&#xff0c;VR已经被广泛应用到许多领域&#xff0c;包括游戏、教育、医疗、房…