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