深入解析:wpf之命令

news/2025/11/8 17:51:23/文章来源:https://www.cnblogs.com/slgkaifa/p/19202758

深入解析:wpf之命令

前言

wpf中命令Command主要用于将 UI 控件(如按钮、菜单项)的触发动作与执行该动作的逻辑代码解耦,主要在MVVM模式使用。

1、命令的三个核心概念

1.1 命令源

命令源是触发命令的 UI 元素,它实现了 ICommandSource 接口,例如 Button、MenuItem、KeyGesture(快捷键),我们最常用的就是鼠标左键点击Button来触发命令,这里的Button就是命令源,一般通过设置命令源的 Command 属性来关联一个命令,比如下面的代码中设置Command属性的值为"ApplicationCommands.Paste",就是关联了一个复制命令。

<Button Content="粘贴"
Command="ApplicationCommands.Paste"
CommandTarget="{Binding ElementName=TargetTextBox}"
Width="40" />

1.2 命令目标

命令目标是命令执行操作的对象。通常是拥有焦点的控件。可以通过命令源的 CommandTarget 属性显式设置,如果未设置,则默认为拥有键盘焦点的元素,比如下面的代码 CommandTarget="{Binding ElementName=TargetTextBox}"就是指定了命令操作的对象是TargetTextBox这个TextBox控件。

<Button Content="粘贴"
Command="ApplicationCommands.Paste"
CommandTarget="{Binding ElementName=TargetTextBox}"
Width="40" />
<TextBox x:Name="TargetTextBox"   Width=" 40" Height=" 20"/>

1.3 命令绑定

命令绑定指定了两件事,一个是当命令被执行时,运行什么代码(对应 Execute方法);另一个是
命令何时可以执行(对应 CanExecute方法),这两个方法都是在接口ICommand中定义,对于部分命令比如"ApplicationCommands.Copy"、"ApplicationCommands.Paste"不需要我们自己写命令绑定,但是一般自定义的命令需要我们自己重写 CanExecute和 Execute方法。

public interface ICommand
{
event EventHandler CanExecuteChanged;
bool CanExecute(object parameter);
void Execute(object parameter);
}

2、系统自带命令

任何实现了 ICommand 接口的类都可以作为 WPF 命令

2.1 复制和粘贴

在这里插入图片描述
下面的代码中我们先用鼠标选中”123“中的“23”,然后点击“复制”按钮,最后点击“粘贴”按钮,这样你就能看到文本”23“被粘贴到最下方的TextBox 中,点击”复制“按钮时就是执行了"ApplicationCommands.Copy"命令,点击”粘贴“按钮就是执行"ApplicationCommands.Paste"命令。

<Window x:Class="wpf之命令.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之命令"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid><StackPanel ><Button  Content="复制"  Width=" 40" Height=" 20" Command="ApplicationCommands.Copy" CommandTarget="{Binding ElementName= tbx_test }" /><TextBox x:Name="tbx_test" Width=" 40" Height=" 20"/><Button Content="粘贴"Command="ApplicationCommands.Paste"CommandTarget="{Binding ElementName=TargetTextBox}"Width="40" /><TextBox x:Name="TargetTextBox"   Width=" 40" Height=" 20"/></StackPanel ></Grid></Window>

3、自定义命令

3.1 MVVM模式-无参数命令

当点击按钮”MVVM模式“时,会触发cmd_test命令绑定的Test方法执行,这样会在控制台打印”自定义命令,参数:“
在这里插入图片描述

<Window x:Class="wpf之命令.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之命令"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid><StackPanel ><Button  Width="80" Height=" 20" Content="MVVM模式" Command="{Binding cmd_test}" /></StackPanel ></Grid></Window>
public class DelegateCommand : ICommand
{
private readonly Action<object> _execute;private readonly Func<object, bool> _canExecute;public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null){_execute = execute ?? throw new ArgumentNullException(nameof(execute));_canExecute = canExecute;}public bool CanExecute(object parameter){if (_canExecute != null){return _canExecute(parameter);}else{return true;}}public void Execute(object parameter){_execute(parameter);}public event EventHandler CanExecuteChanged{add => CommandManager.RequerySuggested += value;remove => CommandManager.RequerySuggested -= value;}}
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propname)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propname));
}
}
}
public class ViewModel : ViewModelBase
{
public DelegateCommand cmd_test { get; set; }
public ViewModel()
{
cmd_test = new DelegateCommand(Test);
}
private void Test(object param)
{
Console.WriteLine($"自定义命令,参数:{param}");
}
}

3.2 MVVM模式-有参数命令

当点击按钮”MVVM模式-有参“时,会触发cmd_test命令绑定的Test方法执行,这样会在控制台打印”自定义命令,参数:123“
在这里插入图片描述

<Window x:Class="wpf之命令.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf之命令"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid><StackPanel Height="419" VerticalAlignment="Bottom" ><Button  Width="120" Height=" 20" Content="MVVM模式-有参" Command="{Binding cmd_test}" CommandParameter="123" /></StackPanel ></Grid></Window>

马工撰写的年入30万+C#上位机项目实战必备教程(点击下方链接即可访问文章目录)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》
7、《C#操作MySql数据库从入门到精通》

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

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

相关文章

【技术术语】指数退避策略

【技术术语】指数退避策略指数退避策略 (Exponential Backoff) 指数退避是一种在网络通信和分布式系统中广泛使用的算法,用于协调重试失败的请求或操作。它的核心思想是:随着连续失败的次数增加,系统会逐渐延长重试…

【技术术语】冒烟测试

【技术术语】冒烟测试冒烟测试(Smoke Testing)是软件测试中的一种初步测试方法,用于快速验证系统的基本功能是否正常,确保软件的核心流程没有严重缺陷。它的名称来源于电路板测试中的“通电冒烟”比喻——如果基本…

2025年同步带直线滑台模组批发厂家权威推荐榜单:同步带直线滑块模组/伺服电机同步带直线模组/直线同步带模组源头厂家精选

在工业自动化高速发展的背景下,同步带直线滑台模组作为核心传动部件,其性能直接关系到自动化设备的定位精度与生产效率。据行业数据显示,2025年全球直线模组市场需求同比增长18.6%,其中同步带模组因速度快、行程长…

【技术术语】服务等级协议

【技术术语】服务等级协议SLA 在计算机和IT服务领域是 Service Level Agreement(服务等级协议) 的缩写,是服务提供商与客户之间定义服务质量和责任的法律协议。以下是关键要点:核心内容服务指标可用性:如服务器正…

【技术术语】命令查询职责分离

【技术术语】命令查询职责分离CQRS(命令查询职责分离)中文解析 CQRS(Command Query Responsibility Segregation)是一种架构模式,它将数据读取操作(查询)与数据更新操作(命令)分离。以下是详细说明: 核心概念…

2025年粉末分级机气流优质厂家权威推荐榜单:气流分级机/气流分级机供应/卧式气流分级机源头厂家精选

在粉体工业领域,气流分级机作为精细分级的关键设备,其技术水平直接影响着粉体产品的粒度分布和产品质量。根据行业数据显示,2024年中国粉体设备市场规模同比增长12.5%,其中气流分级机在非金属矿、新能源材料等领域…

【技术术语】蓝绿部署

【技术术语】蓝绿部署蓝绿部署(Blue-Green Deployment)详解 蓝绿部署是一种零停机时间的应用发布策略,通过维护两个完全相同的生产环境(蓝色和绿色)来实现无缝切换和快速回滚。 核心概念蓝色环境(Blue):当前正在运…

图的易错点

图的易错点处理多组图时 vector<pair<int,int>>e[N]需要在每次新建图时清空 /*错误操作: */ e.clear();/* 正确操作: */ for(int i=1;i<=n;i++){e[i].clear(); }

2025年汽车内饰模具批发厂家权威推荐榜单:汽车轻量化模具/复材模具定制/机器人模具源头厂家精选

在汽车产业转型升级与轻量化趋势加速的背景下,汽车内饰模具市场正迎来快速增长。据行业数据显示,2024年全球汽车内覆盖件模具市场规模达到5.11亿美元,预计到2031年将增长至6.75亿美元,期间年复合增长率约为4.1%。中…

【技术术语】OLAP与OLTP详解

【技术术语】OLAP与OLTP详解OLAP与OLTP详解 OLTP (在线事务处理) Online Transaction Processing 核心特点:面向操作:处理日常业务中的实时交易数据 高频访问:大量简单的短事务(每次操作涉及少量记录) 数据现状:存…

焊接机械手气体节能小秘诀

克鲁斯焊接机械手凭借其高效性、稳定性和灵活性,成为众多企业的首选解决方案。在实际应用中,弧焊过程中保护气体的浪费问题一直困扰着行业从业者。这一问题不仅增加了生产成本,还对环境保护造成了一定压力。为解决这…

JavaScript性能优化实战:按需引入——避免全量导入库 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

zram相关的几个定时任务,服务的位置和作用

定时任务都是系统级的,所以用用户级命令corntab -l是看不到的 1./etc/cron.d/目录下的armbian-truncate-logs1 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 2 3 */15 * * * * root /usr/lib/…

2025年南通AI培训公司权威推荐榜单:智能体/GEO/AI搜索源头公司精选。

在数字化转型加速的背景下,人工智能培训已成为企业提升竞争力的核心需求。据行业统计,2024年中国AI培训市场规模同比增长25%,其中智能体开发、GEO技术及AI搜索等细分领域的培训需求占比超过40%。南通作为长三角的重…

【URP】Unity[后处理]色彩偏移,中间调,高光增强-Lift,Gamma,Gain

Lift、Gamma和Gain是Unity URP后处理系统中基于ASC CDL(美国电影摄影师协会色彩决策列表)标准的色彩分级工具,用于分别控制暗调、中间调和高光的色彩偏移与明度调整。以下是详细解析【从UnityURP开始探索游戏渲染】…

2025年有实力的刮板蒸发器厂家权威推荐榜单:新型刮板蒸发器/耐用的刮板蒸发器/高品质的刮板蒸发器源头厂家精选

在工业废水处理和化工浓缩领域,刮板蒸发器凭借其高效传热和适应高粘度、热敏性物料的特性,已成为关键设备之一。根据行业报告统计,2024年全球刮板薄膜蒸发器市场保持稳定增长,预计到2031年,整体市场规模年复合增长…

引用非当前解决方案sln的项目csproj编译报错

找不到“xxxx.csproj”的项目信息。如果使用 Visual Studio,这可能是因为该项目已被卸载或不属于当前解决方案,因此请从命令行运行还原。否则,项目文件可能无效或缺少还原所需的目标。 要解决“找不到‘*.csproj’项…

从“内存容器”到“对象标签”:解构C到Python的编程认知迁移

从“内存容器”到“对象标签”:解构C到Python的编程认知迁移 摘要 在“C语言先行”的教学范式下,学习者形成的“变量即内存容器”心智模型,在接触Python时遭遇深刻挑战。本文提出,这一困境源于从存储语义到绑定语义…

我的书库(书单)

想读的书单(暂定,待补充)(没有顺序,不分先后) 宇宙的琴弦、生命的跃升、人脑与计算机(冯诺依曼)、平行宇宙、最初的三分钟、差分机、欺骗的艺术 已读的(后面再整理,过早的都忘了) 虚空、卡夫卡短篇、局外人…

Redis-用户签到(BitMap) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …