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