部分一 14年底進入目前公司時,領導準備開發一款新軟體平臺以取代原有平臺。原平臺採用C++Build開發界面(window c/s客戶端) 、Visual Studio(封裝dll模塊)。過完年,領導已把框架搭建完畢(過年期間領導加班了 ^_^ )。當時菜鳥一個(目前老鳥了),新框架用wpf模式,R ...
部分一
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上提交一下該問題,目前還在研究怎麼新建問題,頭大...