命令与ICommand接口

  • 一、命令
    • 1. ICommandSource
    • 2. 示例
    • 3. CommandBinding
  • 二、ICommand
    • 1.ICommand接口
    • 2. ICommand用法
    • 3. CanExecute
  • 总结


一、命令

在这里插入图片描述
官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/commanding-overview

1. ICommandSource

在这里插入图片描述
官方文档:https://learn.microsoft.com/zh-cn/dotnet/desktop/wpf/advanced/how-to-implement-icommandsource

在这里插入图片描述

2. 示例

在这里插入图片描述
在这里插入图片描述

    <Grid><TextBox x:Name="textBox" Text="TextBox" VerticalAlignment="Top"  Height="150" Margin="219,35,187,0"/><Button x:Name="buttonCut"Content="剪切"Command="ApplicationCommands.Cut"CommandTarget="{Binding ElementName=textBox}"Height="100" Margin="219,233,419,102"/><Button x:Name="buttonPaste"Content="粘贴"Command="ApplicationCommands.Paste"CommandTarget="{Binding ElementName=textBox}" Margin="453,233,187,107"/></Grid>

在这里插入图片描述

3. CommandBinding

在这里插入图片描述
在这里插入图片描述

  • 当TEXTBOX内容长度大于0时,CanExecute被判断为true
  • true可以启用命令源按钮,false禁用按钮
    在这里插入图片描述
<Window.CommandBindings><CommandBinding Command="ApplicationCommands.Cut" CanExecute="my_CanExecute" Executed="my_Execute"/>
</Window.CommandBindings><Grid><TextBox x:Name="textBox" Text="TextBox" VerticalAlignment="Top"  Height="150" Margin="219,35,187,0"/><Button x:Name="buttonCut" Margin="219,233,419,102" Height="100" Content="剪切"Command="ApplicationCommands.Cut"/><Button x:Name="buttonPaste"Content="粘贴"Command="ApplicationCommands.Paste"CommandTarget="{Binding ElementName=textBox}"Margin="453,233,187,107"/>
</Grid>
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void my_Execute(object sender, ExecutedRoutedEventArgs e){Console.WriteLine("Execute!!!");textBox.Cut();}private void my_CanExecute(object sender, CanExecuteRoutedEventArgs e){e.CanExecute = textBox.SelectionLength > 0;}
}

二、ICommand

在这里插入图片描述

官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.windows.input.icommand?view=net-9.0

1.ICommand接口

在这里插入图片描述

ICommand接口的属性与事件如下:
在这里插入图片描述

2. ICommand用法

在这里插入图片描述

    <Grid><TextBox HorizontalAlignment="Left" Margin="222,62,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="422" Height="102"/><Button x:Name="button1" Content="  自定义命令" HorizontalAlignment="Left" Margin="222,217,0,0" VerticalAlignment="Top" Height="64" Width="145"/><Button x:Name="button2" Content="触发事件" HorizontalAlignment="Left" Margin="499,217,0,0" VerticalAlignment="Top" Height="64" Width="145"/></Grid>

在MainWindow.xaml.cs文件内自定义命令接口
在这里插入图片描述
在这里插入图片描述

<Window.Resources><local:MyCommand x:Key="MyCMD" />
</Window.Resources>
<Grid><TextBox x:Name="textBox" HorizontalAlignment="Left" Margin="222,62,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="422" Height="102"/><Button x:Name="button1" Content="  自定义命令"Command="{StaticResource MyCMD}"CommandParameter="{Binding ElementName=textBox,Path=Text}"HorizontalAlignment="Left" Margin="222,217,0,0" VerticalAlignment="Top" Height="64" Width="145"/><Button x:Name="button2" Content="触发事件" HorizontalAlignment="Left" Margin="499,217,0,0" VerticalAlignment="Top" Height="64" Width="145"/>
</Grid>
public class MyCommand : ICommand
{public event EventHandler CanExecuteChanged;public bool CanExecute(object parameter){return true;//按钮可以点击//return false;//按钮不可点击}//Execute方法中实现命令处理逻辑public void Execute(object parameter){MessageBox.Show(parameter.ToString());}
}

以下为CanExecuteChanged的事件解释:
在这里插入图片描述

public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();}private void button2_Click(object sender, RoutedEventArgs e){MyCommand c = Resources["MyCMD"] as MyCommand;//触发CanExecuteChangedc.RaiseCanExecuteChanged();}
}
//实现ICommand接口
public class MyCommand : ICommand
{public event EventHandler CanExecuteChanged;public bool CanExecute(object parameter){String str = parameter as String;return str?.Length > 0;//return true;//按钮可以点击//return false;//按钮不可点击}//Execute方法中实现命令处理逻辑public void Execute(object parameter){MessageBox.Show(parameter.ToString());}//定义一个方法,手动触发CanExecuteChanged事件public void RaiseCanExecuteChanged() {//表面上,没有为 CanExecuteChanged 这个事件添加任何订阅方法//例如CanExecuteChanged += fun;//但是我们为按钮设置命令时,自动加入了一个此事件订阅的方法,//并且这个订阅的方法,会去调用命令的CanExecute//可通过Delegate查看CanExecuteChanged的来源与内容Delegate[] delegates = CanExecuteChanged.GetInvocationList();//delegates内查看到 System.Windows.Input.CanExecuteChangedEventManager+HandlerSink"//OnCanExecuteChangedCanExecuteChanged?.Invoke(this, EventArgs.Empty);}

加粗样式

3. CanExecute

以ButtonBase为例介绍,调用了OnCommandChanged
在这里插入图片描述
OnCommandChanged调用了HookCommand
在这里插入图片描述

HookCommand调用了AddHandler,CanExecute调用了CanExecuteCommandSource在这里插入图片描述
在这里插入图片描述
AddHandler调用的PrivateAddHandler又new 了一个HandlerSink
在这里插入图片描述

HandlerSink将OnCommandChanged函数添加到Icommand接口的CanExecuteChanged
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

关于ButtonBase、CanExecuteChangedEventManager、commandHelpers的详细原理、我们可以参考WPF框架的源码
https://github.com/dotnet/wpf/blob/main/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/Primitives/ButtonBase.cs
https://github.com/dotnet/wpf/blob/main/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/Input/Command/CanExecuteRoutedEventArgs.cs
https://github.com/dotnet/wpf/blob/main/src/Microsoft.DotNet.Wpf/src/PresentationFramework/MS/Internal/Commands/CommandHelpers.cs

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

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

相关文章

TCP长连接保持在线状态

TCP长连接是指在一次TCP连接建立后&#xff0c;保持连接状态较长时间&#xff0c;用于多次数据传输&#xff0c;而不是每次通信后立即断开。这种机制对于需要频繁通信的应用非常重要。 保持TCP长连接在线的方法 1. 心跳机制(Heartbeat) 实现原理&#xff1a;定期发送小数据包…

华为OD机试 2025B卷 - 报文响应时间 (C++ Python JAVA JS C语言)

2025B卷目录点击查看: 华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解 2025B卷 100分题型 题目描述 IGMP 协议中,有一个字段称作最大响应时间 (Max Response Time) ,HOST收到查询报文,解折出 MaxResponsetime 字段后,需要在 (0,MaxResponseTime] 时间 (s) 内选…

深入理解微服务中的服务注册与发现(Consul)

在当今数字化浪潮下&#xff0c;微服务架构凭借其高内聚、低耦合的特性&#xff0c;成为众多企业构建复杂应用系统的首选方案。然而&#xff0c;随着服务数量的不断增加&#xff0c;服务之间的调用与管理变得愈发复杂。这时&#xff0c;服务注册与发现就如同微服务架构中的 “导…

Zephyr【2】-----内核调度[1]

内核调度 Zephyr 内核的调度器是基于什么原则选择当前执行线程的&#xff1f; 总是选择优先级最高的就绪线程作为当前线程。 当多个线程优先级相同时&#xff0c;调度器会如何选择&#xff1f; 线程的 “就绪状态” 和 “非就绪状态” 分别指什么&#xff1f;哪些情况会导致…

LangChain内置工具包和联网搜索

目录 一、什么是智能体?工具包又是什么&#xff1f; 二、智能体(Agent)的出现是为了解决哪些问题&#xff1f; 三、LangChain里面创建工具方式 3.1 tool 装饰器&#xff1a;用来定义一个简单的工具函数,, 可以直接给函数加上这个装饰器&#xff0c;让函数成为可调用的工具…

用c++做游戏开发至少要掌握哪些知识?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于用C做游戏开发的相关内容&#xff01; 关…

vue3使用summernote

一、安装 npm install summernote-vue jquery summernote bootstrap popperjs/core二、summernoteEditor.vue <template><div ref"editorRef"></div> </template><script setup> import {ref, onMounted, onBeforeUnmount, watch} f…

低代码平台的性能测试实践与挑战

一、引言 近年来&#xff0c;低代码平台&#xff08;Low-Code Platform&#xff09;正在快速改变企业软件开发方式。Gartner 预测&#xff0c;到 2025 年&#xff0c;超过 70% 的应用开发将基于低代码或无代码技术。通过“拖拉拽建模 图形化逻辑 一键发布”&#xff0c;企业…

Stereolabs ZED系列与ZED X立体相机系列对比:如何根据项目需求选择?

Stereolabs是全球领先的三维视觉技术公司&#xff0c;专注于为机器人、自动化和空间感知等领域提供高性能视觉解决方案。其ZED立体相机系列包括ZED和ZED X两大系列&#xff0c;分别针对多场景三维感知和工业级应用设计&#xff0c;为企业和开发者提供了丰富的选择。ZED系列&…

Spring Boot登录认证实现学习心得:从皮肤信息系统项目中学到的经验

前言 最近通过一个皮肤信息管理系统的项目实践&#xff0c;深入学习了Spring Boot框架中登录认证功能的实现方式。这个项目涵盖了从后端配置到前端集成的完整流程&#xff0c;让我对现代Web应用的安全机制有了更深刻的理解。本文将分享我在这个过程中的学习心得和技术要点。 …

【初阶数据结构】双向链表

文章目录 双向链表1.申请节点2.链表初始化3.尾插4.打印链表5.头插6.尾删7.头删8.查找9.指定位置插入10.删除pos节点11.链表的销毁12.程序源码 双向链表 链表分类 8种 (带头/不带头 单向/双向 循环/循环) 最常用两种 单链表(不带头单向不循环链表) 双向链表&#xff08;带头双向…

从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(下)

六、引入 Cursor AI 编辑器的开发流程革新 在整个系统开发过程中&#xff0c;我大量采用了 Cursor 编辑器作为主要的开发环境&#xff0c;并获得以下关键收益&#xff1a; 具备 AI 补全与代码联想功能&#xff1a;支持通过内置 Copilot 模型对 Python、FastAPI、YAML、JSON 等…

Spark运行架构

Spark框架的核心是一个计算引擎&#xff0c;整体来说&#xff0c;它采用了标准master-slave的结构  如下图所示&#xff0c;它展示了一个Spark执行时的基本结构&#xff0c;图形中的Driver表示master&#xff0c;负责管理整个集群中的作业任务调度&#xff0c;图形中的Executo…

基于未合入PR创建增量patch的git管理方法

目录前言准备操作步骤精准移植基础PR到本地分支修改代码鸿蒙编译、调试、测试具体编译指令、测试步骤这里带过&#xff0c;这不是本文论述重点创建diff文件工作仓库应用最新patch总结前言 作为程序员&#xff0c;多人协同开发同一个需求是正常的。即使是自己一个人搞需求&…

git真正更新项目

背景 Fetch all remote后flutter代码都拉下来&#xff0c;都是Android项目应用不上&#xff1b;git–>update project才生效&#xff01;&#xff01;&#xff01;

AI时代如何拓展Web前端开发的边界

文章目录 1 从“页面仔”到“智能体验构建者”——前端的变与不变2 AI 如何重塑 Web 前端&#xff1a;从开发到用户体验的革命2.1 AI 赋能开发效率&#xff1a;前端工程师的“超级外挂”2.1.1 智能代码辅助与生成2.1.2 自动化测试与 Bug 定位 2.2 AI 提升用户体验&#xff0c;构…

chrome webdrive异常处理-session not created falled opening key——仙盟创梦IDE

注册表错误 :EKKOK:chromeinstallerut1 Lgoogle update settings.cc:26b falled opening key .( e\Update\ClientStateMedium 8A69D345-D564-463c-AFF1-A69D9E530F96} to set usagestats 连接超时 disconnected: received Inspector.detached eventfailed to check if windo…

【Java EE初阶 --- 多线程(进阶)】JUC

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 JUC组件ReentrantLock与s…

免费静态网站搭建

免费静态网站搭建 内容简介搭建步骤GitHub仓库创建Jekyll安装使用Jekyll安装指南Jekyll快速搭建测试Jekyll后续玩法 内容简介 &#x1f6a9;Tech Contents&#xff1a;GithubPage/Jekyll/Custom URLs &#x1f431;GitHub Pages&#xff1a;静态网站托管服务&#xff0c;自动将…

MySQL 8.0 OCP 1Z0-908 题目解析(21)

题目81 Choose two. Examine the modified output: mysql> SHOW SLAVE STATUS\G *************************** 1. row ***************************Slave_IO_Running: YesSlave_SQL_Running: YesSeconds_Behind_Master: 1612Seconds_Behind_Master value is steadily gro…