C# 上下左右键不触发
在表单上,我有一个带有一些按钮的面板。当点击按钮1时,我用一个新的UserControl替换面板,该控件有一个标签,例如this.Controls.Clear、this.Controls.AddUserControl1。除了我的userControl上的标签有一个KeyDown处理程序之外。它工作正常,事件会激发,但不适用于上、下、左和右键。有人能解释为什么这些钥匙之间有区别吗?什么决定事件是否被触发?根据: 此事件支持.NET Framework基础架构,不打算直接从代码中使用 在标签具有焦点时用户按键时发生C# 上下左右键不触发,c#,winforms,user-controls,keydown,C#,Winforms,User Controls,Keydown,在表单上,我有一个带有一些按钮的面板。当点击按钮1时,我用一个新的UserControl替换面板,该控件有一个标签,例如this.Controls.Clear、this.Controls.AddUserControl1。除了我的userControl上的标签有一个KeyDown处理程序之外。它工作正常,事件会激发,但不适用于上、下、左和右键。有人能解释为什么这些钥匙之间有区别吗?什么决定事件是否被触发?根据: 此事件支持.NET Framework基础架构,不打算直接从代码中使用 在标签具有焦点
编辑:这似乎没有其他的活动。从我所读到的,箭头键肯定会被检测到。请提供一些代码。您应该替代方法ProcessCmdKey。箭头键的处理方式与其他标准键不同。另一种解决方案是:由Microsoft建议。要处理箭头键,您可以将窗体的KeyPreview属性设置为true,然后在窗体级别而不是特定的控件级别处理它们。我已经这样做了,它的作品完美 如果以上情况对你不起作用,那么考虑PrimeCMDKEY这样的事情:
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);
}
}
两个基本原因。首先是一个神秘的问题:标签控件无法接收焦点,因此无法看到击键。其键控事件隐藏在设计器中的原因。不太清楚为什么你会看到任何击键。更常见的原因是光标和TAB键用于导航,将焦点从一个控件移动到另一个控件。这是在密钥传递给控件之前完成的。您必须重写该控件,以便重写其IsInputKey方法。但实际上,您应该重写UserControl的ProcessCmdKey来解决这两个问题
还请注意,您的程序中存在严重的句柄泄漏。永远不要调用控件。清除时不同时调用您删除的控件上的Dispose方法。除非您打算以后重用它们,否则这种情况并不常见。这是一种严重的漏洞,垃圾收集器无法解决,并在第一次使程序变得缓慢和笨拙后最终导致程序崩溃。请为您编写的处理程序演示如何使用一些代码。请看这篇文章,它可能会帮助您:您没有提到在用户控件内或主机窗体上处理事件的位置?如果它们是在主机窗体上处理的,那么在添加新的用户控件实例时,您需要将所有事件重新注册到事件句柄。就是这样!因为KeyDown事件是由按钮隐藏的,以便使用键在按钮之间导航:Up、Down、Left-Right、Tab和Enter来单击事件,所以没有触发事件。呼叫面板。在清除控件之前处理解决了我的问题。非常感谢你!