KeyDown不会向上,向下,向左和向右触发

时间:2012-08-01 07:53:28

标签: c# winforms user-controls keydown

在表格上我有一个带有一些按钮的面板。单击button1时,我将面板替换为具有标签的新UserControl(例如this.Controls.Clear()this.Controls.Add(UserControl1))。除了我的userControl上的标签有一个KeyDown处理程序。它工作正常,事件触发,但不是键,向上,向下,向左和向右。任何人都可以解释为什么这些键之间存在差异?什么决定事件是否被解雇?

4 个答案:

答案 0 :(得分:5)

两个基本原因。首先是神秘的一个:Label控件无法获得焦点,因此无法看到击键。其KeyDown事件隐藏在设计器中的原因。不太确定为什么你会看到任何按键。更常见的原因是光标和TAB键用于导航,将焦点从一个控件移动到另一个控件。在将键传递给控件之前已完成。您必须覆盖控件,以便可以覆盖其IsInputKey()方法。但实际上你会覆盖UserControl的ProcessCmdKey()而不是解决这两个问题。

另请注意,您的程序中存在令人讨厌的句柄泄漏。 从不调用Controls.Clear()而不调用您删除的控件上的Dispose()方法。除非你打算以后重复使用它们,否则不常见。这是一种令人讨厌的泄漏,垃圾收集器无法解决,并且在首次使其变得缓慢且笨拙之后最终导致程序崩溃。

答案 1 :(得分:1)

根据MSDN

  

此活动支持.NET Framework基础结构,不能直接在您的代码中使用

     

当用户在标签具有焦点时按下某个键时发生。

编辑:似乎没有替代事件。根据我的阅读,绝对应该检测到箭头键。请提供一些代码。

答案 2 :(得分:1)

您应该重写方法ProcessCmdKey。箭头键的处理方式与其他标准键的处理方式不同。另一个解决方案是这个:Microsoft提出的http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

答案 3 :(得分:0)

要处理箭头键,您可以将Form的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);
        }

 }