2012-08-01 71 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