Microsoft.Windows.Controls.Ribbon.RibbonWindow 碰到 AvalonDock出现的诡异现象
部分一
14年底进入目前公司时,领导准备开发一款新软件平台以取代原有平台。原平台采用C++Build开发界面(window c/s客户端) 、Visual Studio(封装dll模块)。过完年,领导已把框架搭建完毕(过年期间领导加班了 _ )。当时菜鸟一个(目前老鸟了),新框架用wpf模式,RibbonWindow(界面功能按钮) + AvalonDock(界面布局,灵活好用),工具当然是最新的Visual Studio 2013了。虽然使用wpf开发,但是上位机软件客户不关心UI美观与否,只看功能是否强大。也因此本人只是把checkbox,Text等常用控件按照网上资料封装供自己调用,自定义控件方向没再继续往下研究。用的比较多的是用MVVM模式开发一些业务逻辑。绑定真的好用,View与ViewModel之间数据传输不需要在编写代码了。需求改变时,工作量也大大减轻了,从此步入新社会了。废话不多说,进入正题
16年中测试人员反馈,软件莫名其妙情况下,界面上一些输入控件无法响应键盘输入。接到反馈后,我们立即排查分析。
1、怀疑键盘消息没有传递到软件,但是现象出现时一部分控件可以输入,一部分无法输入,分分钟立刻打脸;
2、因无法输入的控件不是wpf本身提供控件,是一些mfc封装的窗口中的控件或者引用的winform控件如DataGridView,此时怀疑兼容性原因,看了微软官方资料,在窗口前添加
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this)
还是无法解决问题。最终因能力不够只能临时搁浅此问题,采用临时方案,增加一个键盘输入窗口,当问题出现时,调用键盘输入窗口输入信息。
随着时间流失,我从小菜鸟变成了老菜鸟,但是该问题一直徘徊在我脑海中,无情嘲笑我,菜逼!!!
部分二
18年4月份,我重新回头查看此问题,主要看一下开源源码 以期能解决问题。无意中我发现了造成此现象的原因。
1、点击RibbonSplitButton按键一次,下拉菜单弹出,再点击一次下拉菜单收回。此时无法输入信息
2、点击RibbonSplitButton按键一次,下拉菜单弹出,再点击其它地方。此时无法输入信息
3、点击RibbonSplitButton按键一次。此时可以输入信息。
请看下图,操作步骤按照1、2、3进行

能重现问题,顿时感觉希望就在眼前。难道是RibbonSplitButton控件造成的,替换成RibbonMenuButton,结果还是一样。难不成重写一个控件?此方案放到最后吧,再想想其它思路。新在公司测试代码没法考出来,周末在自己电脑重新新建了一个工程。然而不管怎么点击,一直可以输入。难不成是我们平台其它bug造成的?天啊,平台开发3年多了,怎么去找问题,一个一个模块排除吗?终于,苦心人天不负,付出是有回报的。我发现自己新建工程中的RibbonWindow与公司不是同一个。公司引用Microsoft.Windows.Controls.Ribbon.RibbonWindow,而我引用System.Windows.Controls.Ribbon.RibbonWindow。
部分三
胜利就在眼前了,赶紧重新新建两个工程,分别引用Microsoft.Windows.Controls.Ribbon.RibbonWindow和System.Windows.Controls.Ribbon.RibbonWindow,其余代码不变。结果引用Microsoft.Windows.Controls.Ribbon.RibbonWindow出现键盘无法输入现象,另一个正常。
笔记
该问题只能说临时解决了,Microsoft.Windows.Controls.Ribbon.RibbonWindow库出现原因不清楚。也没在继续跟踪下去。准备在stackoverflow上提交一下该问题,目前还在研究怎么新建问题,头大...
Microsoft.Windows.Controls.Ribbon.RibbonWindow 碰到 AvalonDock出现的诡异现象的更多相关文章
- ON_NOTIFY_REFLECT : Message Reflection for Windows Controls
转自: https://msdn.microsoft.com/en-us/library/eeah46xd.aspx TN062: Message Reflection for Windows Con ...
- (原创)用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒
Microsoft Chart Controls(简称MSChart)控件,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式. MSChart 在.NET 4.0自 ...
- 用Microsoft Chart Controls(MSChart)实现曲线图,并支持拖动放大到秒
Microsoft Chart Controls(简称MSChart)控件,给图形统计和报表图形显示提供了很好的解决办法,同时支持Web和WinForm两种方式. MSChart 在.NET 4.0自 ...
- [C#] 老古董的 Microsoft Chart Controls 也可以进行数据预测
我要先声明,这篇文章介绍到的内容虽说不是不能用,但玩乐成分居多,大家看看就好,不要太认真. 1. Microsoft Chart Controls 中的 FinancialFormula 在上一篇文章 ...
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
- 需要正确安装 Microsoft.Windows.ShellExperienceHost 和 "Microsoft.Windows.Cortana" 应用程序。
windows 10 开始菜单修复工具 Win10开始菜单修复工具出现的原因,自从升级到Windows 10,一直BUG不断,而其中有一个BUG非常的让你印象深刻,就是开始菜单无响应,你用着用着电脑 ...
- 驱动开发利器Microsoft Windows Driver Kit 7.1.0下载
在Windows 2000 与Windows XP 系统采用是WINDDK来开发WINDOWS驱动程序,我手头也有WINDDK,可是从Windows Vista开始之后,一般采用Microsoft W ...
- "Hello World!" for Microsoft Windows
"Hello World!" for Microsoft Windows It's time to write your first application! The follow ...
- C++ 无法将值写入注册表 HKEY_LOCAL_MACHINE\Sofeware\Microsoft\Windows\CurrentVersion\Run,以实现开机自启动应用程序。
C++ 无法将值写入注册表 HKEY_LOCAL_MACHINE\Sofeware\Microsoft\Windows\CurrentVersion\Run,以实现开机自启动应用程序.但可以写入到H ...
随机推荐
- qt 界面去掉系统边框
该代码在Qt5框架编辑,使用该类时, 直接继承这个类就可以了. 实现了拖拽功能和关闭功能,如果需要放大缩小功能, 需自己实现. 1 #ifndef CUSTOMIZE_QWIDGET_H #defin ...
- JAVA 设置模块间的依赖关系
项目目录概况 Demo01项目 Test01.java package com.sam.demo01; public class Test01 { public void ShowTest01() { ...
- HTTP协议中的chunked编码解析
\r\n\r\n"了. chunked编码很简单,是不是? 不过,在协议还原的实现过程中,如何高效高性能地对chunked进行解码,是一件值得挑战的事哦.毕竟,HTTP的流量占比不小的. 长 ...
- Spring Cloud Netflix Ribbon详细介绍及自定义规则策略
之前文章我们介绍了如何配置具有Ribbon轮询机制的负载均衡策略的消费者,这次来具体了解一下Ribbon的一些细节,以及如何自定义负载均衡策略等. 说一下Ribbon实现负载均衡的大致思路.它通过用@ ...
- [Linux]gocron定时任务平台的部署
采用二进制文件的方式部署非常简单,因为go已经把源码打包成了可执行文件,下载下来直接运行就可以了,不需要自己去编译和配置依赖 下载执行文件的地址是:https://github.com/ouqiang ...
- Linux 安装并配置zsh
1. 安装zsh,配置agnoster主题 1.1 安装zsh $ sudo apt-get install -y zsh 1.2 安装oh-my-zsh $ sh -c "$(curl - ...
- 分析-flag被盗
用wireshark打开数据包 寻找http协议的数据 找一个post包进行TCP追踪流 寻找flag
- js 构造函数中的 return
本文链接:https://blog.csdn.net/qq_36209248/article/details/89190978 默认情况下,没有return的函数的返回值为undefined(即没有定 ...
- jmeter录制移动端脚本
jmeter录制脚本有两种方式,一种借助外部工具badbody,一种是本身的功能,使用代理服务器,介绍下如何使用代理服务器录制脚本.我一般在测app或者移动端H5页面时才会录制,所以此文也针对移动端. ...
- Log日志级别从高到低排序 ERROR、WARN、INFO、DEBUG
Log4j建议只使用四个级别,优先级从高到低分别是 ERROR.WARN.INFO.DEBUG.通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关.比如在这里定义了INFO级别,则应 ...