2012-08-01 61 views
0

在表單我有一些按鈕的面板。當單擊button1時,我用一個帶有標籤的新UserControl替換該面板(例如this.Controls.Clear(),this.Controls.Add(UserControl1))。除了我的userControl上的標籤有一個KeyDown處理程序。它工作正常,事件觸發,但不適用於向上,向下,向左和向右鍵。任何人都可以解釋爲什麼這些鍵之間有區別嗎?什麼決定事件是否被解僱?KEYDOWN沒有發射的上,下,左,右

+0

請使用一些代碼來說明你已經寫過的處理程序 – HatSoft 2012-08-01 07:55:08

+0

看看這篇文章,它可能會幫助你:http://stackoverflow.com/questions/1646998/up-down-left-and-right -arrow-keys-do-not-trigger-keydown-event – SidAhmed 2012-08-01 08:00:30

回答

5

兩個基本原因。首先是神祕的:標籤控件無法獲得焦點,因此無法看到擊鍵。其KeyDown事件隱藏在設計器中的原因。不太確定爲什麼你看到任何按鍵。更常見的原因是光標和TAB鍵用於導航,將焦點從一個控件移動到另一個控件。在之前完成這個鍵被傳遞給控件。您必須重寫控件,以便可以重寫其IsInputKey()方法。但是更實際的情況是,您會覆蓋UserControl的ProcessCmdKey()來解決這兩個問題。

另外請注意,你有你的程序中一個討厭的句柄泄漏。 從不調用Controls.Clear(),而不調用您刪除的控件上的Dispose()方法。除非您打算稍後重用它們,否則不常見。這是垃圾收集器無法解決的一種令人討厭的泄漏,並且在首先使程序變得緩慢且笨拙後最終崩潰。

+0

就是這樣!由於KeyDown事件被按鈕隱藏(要使用按鍵瀏覽按鈕:向上,向下,向左,標籤和輸入點擊),事件並未觸發。在清除控件之前調用panel.Dispose()解決了我的問題。非常感謝你! – alex555 2012-08-01 10:49:54

1

根據MSDN

此事件支持.NET Framework基礎,不適合直接從您的代碼使用。

當用戶按下一個鍵時標籤有焦點時發生。

編輯:似乎沒有這種替代事件。從我讀過的,箭頭鍵肯定應該被檢測到。請提供一些代碼。

0

要處理箭頭鍵,您既可以在窗體的KeyPreview屬性設置爲true,然後在形式層面,而不是具體的控制水平處理它們。我已經這樣做了,它完美無缺!

在的情況下,上述方法不爲你工作,然後再考慮ProcessCmdKey是這樣的:

protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) 
{ 

     if(KeyData == Keys.Right) 
     { 
     //Move Right 
     return true; 
     } 
     else 
     { 
     return base.ProcessCmdKey(msg, keyData); 
     } 

} 
+0

你沒有提到你的事件在用戶控件或宿主窗體中被處理的位置?如果它們在主機窗體上處理,則在添加用戶控件的新實例時,您需要將所有事件重新註冊到事件句柄。 – Munawar 2012-08-01 08:19:57