用于在.NET中进入检测的KeyUp vs KeyDown

时间:2014-08-08 10:00:37

标签: .net

  • 我有一个文本框
  • 用户输入一些值
  • 用户按Enter键
  • 系统做了一些事情

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

我是否有理由将KeyDown用于KeyUp?

2 个答案:

答案 0 :(得分:3)

嗯,这很重要。如果您使用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类似于控制台模式应用程序。输入假设要做的是操作窗口上的默认接受按钮。由Form.AcceptButton属性支持。 Escape键也是特殊的,它操作Form.CancelButton按钮。但是,对于对话式窗口,只能做真正有意义的事情。

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

答案 1 :(得分:0)

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

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

防止多次处理事件。