【问题标题】:KeyDown not firing for Up, Down, Left and RightKeyDown 不为 Up、Down、Left 和 Right 触发
【发布时间】:2012-08-01 16:24:39
【问题描述】:

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

【问题讨论】:

标签: c# winforms user-controls keydown


【解决方案1】:

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

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

【讨论】:

  • 就是这样!因为 KeyDown 事件被按钮隐藏(使用键导航按钮:向上、向下、向左、向右、Tab 和 Enter 以单击)该事件没有触发。在清除控件之前调用 panel.Dispose() 解决了我的问题。非常感谢!
【解决方案2】:

根据MSDN

此事件支持 .NET Framework 基础架构并且不打算直接从您的代码中使用

当用户在标签获得焦点时按下一个键时发生。

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

【讨论】:

    【解决方案3】:

    您应该改写 ProcessCmdKey 方法。箭头键的处理方式与其他标准键不同。另一种解决方案是:微软建议的http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您还没有提到您的事件是在用户控件内部还是在主机表单上处理的?如果它们是在主机表单上处理的,那么您需要在添加新的用户控件实例时将所有事件重新注册到事件句柄。
      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2021-05-25
      • 2011-04-02
      • 2023-02-25
      相关资源
      最近更新 更多