Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 上下左右键不触发_C#_Winforms_User Controls_Keydown - Fatal编程技术网

C# 上下左右键不触发

C# 上下左右键不触发,c#,winforms,user-controls,keydown,C#,Winforms,User Controls,Keydown,在表单上,我有一个带有一些按钮的面板。当点击按钮1时,我用一个新的UserControl替换面板,该控件有一个标签,例如this.Controls.Clear、this.Controls.AddUserControl1。除了我的userControl上的标签有一个KeyDown处理程序之外。它工作正常,事件会激发,但不适用于上、下、左和右键。有人能解释为什么这些钥匙之间有区别吗?什么决定事件是否被触发?根据: 此事件支持.NET Framework基础架构,不打算直接从代码中使用 在标签具有焦点

在表单上,我有一个带有一些按钮的面板。当点击按钮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来单击事件,所以没有触发事件。呼叫面板。在清除控件之前处理解决了我的问题。非常感谢你!