WPF之坑——ICommandSource与RoutedUICommand
最近在项目中自己写了一个控件A,继承自contentcontrol,实现了icommandsource接口。(因需求特殊并没有使用buttonbase及它的派生类为基类),控件A在测试程序中运转良好,绑定的命令响应方法能够被正确执行。下边代码是控件A执行命令的部分:
RoutedEventArgs rea = new RoutedEventArgs(Button.ClickEvent, this);
RaiseEvent(rea);if (!rea.Handled && Command != null)
{Command.Execute(CommandParameter);
}
但在实现项目中,我将控件A放在了另一个较为复制杂的控件B的template中,并在控件B的commandbindings中设置了命令绑定,命令使用的是WPF原生命令类型RoutedUICommand。这个时候诡异的事件发生了,不论我怎么在template里边设置控件A的commandtarget属性,上边代码执行了Command.Execute(CommandParameter)这句之后,B绑定的命令响应方法都不会被调用。
之后在群里问了一些大神,都没有得到解决方法,于是乎查了下.net码源,看看buttonbase是如何处理这个问题。
不看不知道,一看吓一跳,在buttonbase中处理命令时,用到了大量的.net项目里的internal类或方法(微软这是成心留一手啊!)
#from buttonbase.cs /// <summary>
/// This virtual method is called when button is clicked and it raises the Click event
/// </summary>
protected virtual void OnClick()
{RoutedEventArgs newEvent = new RoutedEventArgs(ButtonBase.ClickEvent, this);RaiseEvent(newEvent);MS.Internal.Commands.CommandHelpers.ExecuteCommandSource(this);
}
#from CommandHelpers.cs
internal static void ExecuteCommandSource(ICommandSource commandSource)
{CriticalExecuteCommandSource(commandSource, false);}internal static void CriticalExecuteCommandSource(ICommandSource commandSource, bool userInitiated)
{ICommand command = commandSource.Command;if (command != null){object parameter = commandSource.CommandParameter;IInputElement target = commandSource.CommandTarget;RoutedCommand routed = command as RoutedCommand;if (routed != null){if (target == null){target = commandSource as IInputElement;}if (routed.CanExecute(parameter, target)){routed.ExecuteCore(parameter, target, userInitiated);}}else if (command.CanExecute(parameter)){command.Execute(parameter);}}
}
从上边.net这几段代码里我们可以看到,buttonbase在执行命令里的时候,使用的是 CommandHelpers这个内部类中定义的方法,而这个方法的核心逻辑是先判断使用的命令是不是RoutedCommand类型,如果是的话则可能会使用RoutedCommand的内方法ExecuteCore去执行命令,而在这个方法中才有commandtarget这个参数。
总结一下,如果你的控件不是继承自buttonbase,那么就不能使用RoutedCommand.RoutedCommand这个内部方法,不能使用这个内部方法那么RoutedCommand就不会认你自己设置的commandtarget,那么如果.net库自己找到target不对,你再怎么设置也是徒劳。。。(我感觉被微软深深伤害了)
说明白点,不要把自己实现icommandsource的类型与routedcommand搭配使用!
转载于:https://www.cnblogs.com/GuoRL/p/5778868.html
WPF之坑——ICommandSource与RoutedUICommand相关推荐
- WPF 踩坑 DataGrid DataGridTextColumn根据文本内容改变颜色绑定转换器
Foreground 属性不会触发转换器!!!!!!!!!!! Foreground 属性不会触发转换器!!!!!!!!!!! Foreground 属性不会触发转换器!!!!!!!!!!!
- WPF下聊天气泡的实现
零.版本履历 日期 说明 2020.05.02 初稿 一.效果 先看最终效果. 最终微聊烂尾了,更确切地说,还没开始就结束了. 二.由来 产品虽然没有最终做出来,但至少聊天气泡打磨的还挺像样的. 说说 ...
- C#事件中sender的小用法
C#事件中sender的小用法 开WPF新坑了,看了WPF的炫酷界面,再看看winForm实在是有些惨不忍睹(逃).后面会开始写一些短的学习笔记. 一.什么是sender sender最常见到的情况就 ...
- C#事件中sender的小用法(转载)
C#事件中sender的小用法 开WPF新坑了,看了WPF的炫酷界面,再看看winForm实在是有些惨不忍睹(逃).后面会开始写一些短的学习笔记. 一.什么是sender sender最常见到的情况就 ...
- 2019-8-28-WPF-开发
title author date CreateTime categories WPF 开发 lindexi 2019-8-28 11:3:39 +0800 2018-2-13 17:23:3 +08 ...
- WPF 自定义控件的坑(蠢的:自定义控件内容不显示)
WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 原文:WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- slider wpf 垂直_WPF自定义Slider样式踩坑记录
0x01. 概要 WPF 自带的拖动条控件是 Slider, 其默认样式为: 这种风格一般很难和实际的APP匹配, UI肯定会给一种自己的APP风格的拖动条. 最简单的莫过于修改滑块图案, 滑轨颜色等 ...
- WPF 坑系列之一 颜色渐变动画
WPF 颜色渐变动画 坑 动画对象不能用于动画属性"BorderBrush",因为它是不兼容的类型"System.Windows.Media.Brush" &l ...
- 【wpf】[踩坑日记] “组件“XXX”不具有由 URI“XXX“识别的资源”
报错背景 这是一个和反射相关的奇怪问题: 具体报错如下: 报错的地方是: 这里是我想通过,prism提供的方式,弹出一个子窗口.这里prism应该也是用到的反射技术. 本来这段代码是正常工作的. 但是 ...
最新文章
- js防止客户端多触发
- “旧城改造”的背后——银泰新零售阿里云解决方案(上)
- 用Perl做个简单”下载者病毒”
- 什么是回调地狱以及promise的链式调用和aysnc/await
- leetcode213. 打家劫舍 II
- js中for循环调用回调函数,一直循环最后一个
- (23)Verilog HDL条件语句:if-else语句
- [Teaching] [Silverlight] 30秒快速建立遊戲迴圈 (Game Loop)
- 深度学习中常用的数据集
- Android开发眼镜店管理系统,智能眼镜店管理系统(基于BS架构互联网版)下载_智能眼镜店管理系统(基于BS架构互联网版)官方下载-太平洋下载中心...
- 别让生活 耗尽了你的耐心和向往 你还有诗和远方...
- 股市前复权、后复权与不复权
- 一 . css系列之html需知及ps的基础操作
- 中国17家创业公司的失败史
- 学习C语言的一些感悟
- 【转载】第三方支付业务如何测试
- 局部保留投影算法(LPP)(Locality Preserving Projections)详解
- python读取文件路径报invalid_Python: 目录名无效怎么办?
- 快来学学爱用建站新功能【Light Press】微单页,超级实用
- 在ArcMap中添加经纬网