【问题标题】:KeyUp vs KeyDown for enter-detection in .NETKeyUp 与 KeyDown 用于 .NET 中的输入检测
【发布时间】:2014-08-08 10:00:37
【问题描述】:
  • 我有一个文本框
  • 用户输入了一些值
  • 用户按 Enter 键
  • 系统做了一些事情

一个非常标准的动作序列,我想知道是使用 KeyDown 还是 KeyUp 事件。现在,我在此找到的几乎所有示例都使用 KeyDown 事件来检测是否按下了回车键。但是,根据this article 的说法,KeyDown 事件在某个键被按住一段时间时会触发多次。这引发了我的问题:我为什么要使用 KeyDown?如果用户不小心按住了回车键,我的事件将被触发多次,这不是我想要的。

有什么原因我会使用 KeyDown 而不是 KeyUp?

【问题讨论】:

  • 不,在这种情况下没有理由使用 KeyDown 而不是 KeyUp。但我不知道您为什么要将 Enter 困在 TextBox 中。这应该移动到下一行。

标签: .net


【解决方案1】:

嗯,这很重要。如果您使用 KeyUp,那么您还必须处理获取 Enter 键的 KeyPress 事件。哪个,它没有被拦截,会产生一个讨厌的 BEEP 来打用户。 Boilerplate 是始终使用 KeyDown 以便您可以阻止 KeyPress 事件触发:

    private void textBox1_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyData == Keys.Enter) {
            e.Handled = e.SuppressKeyPress = true;
            // Something special ...
            //...
        }
    }

SuppressKeyPress 分配防止 KeyPress 事件触发。

请记住,处理 Enter 通常是相当粗俗的,这表明您可能过于努力地使您的 GUI 类似于控制台模式应用程序。 Enter 应该要做的是操作窗口上的默认接受按钮。由 Form.AcceptButton 属性支持。 Escape 键也很特殊,它操作 Form.CancelButton 按钮。然而,只有真正有意义的事情才能为对话框式窗口做。

如果在常规窗口上使用,那么典型的问题是用户不知道按 Enter 键是他应该做的。他会将鼠标移到另一个文本框,并完全错过您的 UI 设计的预期用途,这是 可发现性 的问题。在这种情况下,您不能执行 ToolStripMenuItem.ShortcutKeyDisplayString 的等效操作。

【讨论】:

    【解决方案2】:

    您可以添加一些布尔字段(enterInProcessed)并检查:

     if (e.KeyCode == Keys.Enter && !enterProcessed){
         enterProcessed = true; 
         ...
     }
     enterProcessed = false;
    

    防止多次处理事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-08
      • 2017-02-04
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      相关资源
      最近更新 更多