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上提交一下該問題,目前還在研究怎麼新建問題,頭大...