您好,登錄后才能下訂單哦!
在Winform中我們可以通過在按鈕的名稱上使用&來給按鈕設置熱鍵。但是如果多個按鈕有相同的熱鍵時會發生什么呢?我們來做個實驗。
我們放三個按鈕并設置同樣的熱鍵,然后在每個按鈕的處理函數里使用MessageBox.Show來輸出自己的名稱,以此來說明哪個按鈕被觸發了。
運行程序后,按Alt+b你會發現彈出了button2的提示,按確定后沒再有別的提示。如下圖:
這時你再讓button2獲取焦點后再按Alt+b試試,你會收到button3的提示。由此可以得出,Winform是根據當前的焦點位置和Tab順序來搜索下一個可觸發熱鍵的控件來處理的。要注意的是搜索的順序是從當前焦點的下一個控件開始到當前焦點的控件為止來搜索。
我們再做一個試驗,新建一個用戶控件,在這個用戶控件中我們添加一個按鈕,并將熱鍵設置為Alt+b。在后臺添加一個Sequence屬性,在控件的Load事件中將button的名稱上加上Sequence的值,在按鈕的Click事件中Show出按鈕的名稱以表示哪個按鈕被觸發。
用戶控制做好后我們將它添到我們的form上,放三個并依次將Sequence屬性改為1,2,3。
運行后,我們將焦點定位到ucbutton1上后按Alt+b,你會發現提示uc&button1的消息。ucbutton2和uc&button3也是如此。
那為什么會這樣呢?是不是Usercontorl有不同的處理呢?我們再來做個實驗吧。再新建一個用戶控件,添加3個按鈕設置相同的熱鍵,并添加后臺方法如下:
再將這個用戶控件添加到窗體中。
運行程序后把焦點置于button3后按Alt+b你會收到uc2button1的提示,通過上面的結論這個是正確的。當你把焦點置于uc2button1時按Alt+b你會收到uc2button2的提示,當你把焦點置于uc2button3上時按Alt+b你會收到uc2button1的提示。
所以可以得出結論了。當焦點進入usercontrol之后Winform搜索下一個可觸發控件的范圍就限定在這個用戶控件內了。現在也可以理解第二個實驗為會ucbutton1~3會觸發當前按鈕的原因了,因為在用戶控件的范圍內只有一個熱鍵為Alt+b的控件。
不過我們正常情況下是不會遇到這個問題的,我是在一個form上加載多次同一個用戶控件時才遇到這個問題的。個人認為我們不應該依賴于Winform的這種搜索機制,而是自己多加處理來控制熱鍵的觸發邏輯,如通過Enable或Visable來保證熱鍵不沖突。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。