14年末进入目前公司时,领导准备开发一款新软件平台以取代原有平台。原平台采用C++Build开发界面(window c/s客户端) 、Visual Studio(封装dll模块)。过完年,领导已把框架搭建完毕(过年期间领导加班了 ^_^ )。当时菜鸟一个(目前老鸟了),新框架用wpf模式,RibbonWindow(界面功能按钮) + AvalonDock(界面布局,灵活好用),工具固然是最新的Visual Studio 2013了。虽然使用wpf开发,可是上位机软件客户不关心UI美观与否,只看功能是否强大。也所以本人只是把checkbox,Text等经常使用控件按照网上资料封装供本身调用,自定义控件方向没再继续往下研究。用的比较多的是用MVVM模式开发一些业务逻辑。绑定真的好用,View与ViewModel之间数据传输不须要在编写代码了。需求改变时,工做量也大大减轻了,今后步入新社会了。废话很少说,进入正题c#
16年中测试人员反馈,软件莫名其妙状况下,界面上一些输入控件没法响应键盘输入。接到反馈后,咱们当即排查分析。
一、怀疑键盘消息没有传递到软件,可是现象出现时一部分控件能够输入,一部分没法输入,分分钟马上打脸;
二、因没法输入的控件不是wpf自己提供控件,是一些mfc封装的窗口中的控件或者引用的winform控件如DataGridView,此时怀疑兼容性缘由,看了微软官方资料,在窗口前添加windows
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this)
仍是没法解决问题。最终因能力不够只能临时搁浅此问题,采用临时方案,增长一个键盘输入窗口,当问题出现时,调用键盘输入窗口输入信息。框架
随着时间流失,我从小菜鸟变成了老菜鸟,可是该问题一直徘徊在我脑海中,无情嘲笑我,菜逼!!!less
18年4月份,我从新回头查看此问题,主要看一下开源源码 以期能解决问题。无心中我发现了形成此现象的缘由。工具
一、点击RibbonSplitButton按键一次,下拉菜单弹出,再点击一次下拉菜单收回。此时没法输入信息布局
二、点击RibbonSplitButton按键一次,下拉菜单弹出,再点击其它地方。此时没法输入信息测试
三、点击RibbonSplitButton按键一次。此时能够输入信息。ui
请看下图,操做步骤按照一、二、3进行this
能重现问题,顿时感受但愿就在眼前。难道是RibbonSplitButton控件形成的,替换成RibbonMenuButton,结果仍是同样。难不成重写一个控件?此方案放到最后吧,再想一想其它思路。新在公司测试代码无法考出来,周末在本身电脑从新新建了一个工程。然而无论怎么点击,一直能够输入。难不成是咱们平台其它bug形成的?天啊,平台开发3年多了,怎么去找问题,一个一个模块排除吗?终于,苦心人天不负,付出是有回报的。我发现本身新建工程中的RibbonWindow与公司不是同一个。公司引用Microsoft.Windows.Controls.Ribbon.RibbonWindow,而我引用System.Windows.Controls.Ribbon.RibbonWindow。code
胜利就在眼前了,赶忙从新新建两个工程,分别引用Microsoft.Windows.Controls.Ribbon.RibbonWindow和System.Windows.Controls.Ribbon.RibbonWindow,其他代码不变。结果引用Microsoft.Windows.Controls.Ribbon.RibbonWindow出现键盘没法输入现象,另外一个正常。
该问题只能说临时解决了,Microsoft.Windows.Controls.Ribbon.RibbonWindow库出现缘由不清楚。也没在继续跟踪下去。准备在stackoverflow上提交一下该问题,目前还在研究怎么新建问题,头大...