2016年11月29日 星期二

[WinForm]取消focus狀態

這篇要做的事情跟前一篇的取消textbox輸入狀態不同
textbox只要將form的active control改成null或其他control就可以取消輸入狀態
但如果今天是想取消鍵盤事件對子Control的校果(例如只在特定狀態下讓快捷鍵能對子control作用)就沒這麼簡單
主要的問題是出在取消active control只是讓使用者不會繼續輸入,但是鍵盤事件一樣會被control接收到


要讓control不要接收到事件有兩個方法

1. 將focus指到label之類的其他事件

雖然form的canFocus屬性是true,但真的focus到form上,鍵盤按下去,control還是會收到event
最簡單的方法就是找個不能輸入的替死鬼(ex:一個label)把它focus起來
label1.Focus()
這樣目標control就脫離苦海了
這方法看似蠢,其實很好用,因為有些事件不一定是你在你的程式寫的。如果叫用函式庫,他可能搶在你的form preview之前就先把event處裡掉,第二招就會無效

2. 利用form.keyPreview攔截事件

將form的kePreview打開
在form1.KeyXXX事件中 將KeyEventArgs e的Handled改為true
如此event就不會往下傳了,也就是說子Control的KeyXXX不會被觸發

結論

當Focus在Control上(Form先天無法得到Control)
keyPreview關閉: Form的KeyXXX不會被觸發
keyPreview開啟:Form的KeyXXX先被觸發,Control的KeyXXX才被觸發。若在Form的觸發中將Handeled改為true,Control不會被觸發

沒有留言:

張貼留言