.net – 设置Form.KeyPreview = true的缺点

我不知道Form.KeyPreview属性实际上是什么好的?为什么它存在,通过将其设置为真,我有什么“风险”?我想这必然会有一些负面影响 – 否则它根本不应该存在(或者至少在默认情况下是真的)?

编辑:我非常了解它的作用。我问为什么为什么我必须将其设置为true才能使键盘事件触发?为什么键盘事件总是触发窗体。什么不仅仅是标准行为?

我特别的问题是:我刚刚在我的应用程序的基本形式中设置了KeyPreview = true,其中所有其他形式都继承。我是否有任何令人讨厌的惊喜?

Form.KeyPreview有点不合时宜,继承自Visual Basic对象模型的表单设计。回到VB6天,您需要KeyPreview才能实现快捷键击。这在Windows Forms中不再需要,覆盖ProcessCmdKey()是更好的解决方案:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  if (keyData == (Keys.Control | Keys.F)) {
    DoSomething();   // Implement the Ctrl+F short-cut keystroke
    return true;     // This keystroke was handled, don't pass to the control with the focus
  }
  return base.ProcessCmdKey(ref msg, keyData);
}

但是KeyPreview支持帮助VB6程序员的军团在二千年代初转向.NET。 KeyPreview或ProcessCmdKey()的要点是允许您的UI响应快捷键击。键盘消息通常发送到具有焦点的控件。 Windows窗体消息循环允许代码在控件看到之前仔细查看该消息。这对于快捷键很重要,为每个控件实施KeyDown事件可能会使焦点发现它们是不切实际的。

将KeyPreview设置为True不会导致问题。该窗体的KeyDown事件将运行,它只会有一个影响,如果它有代码,做一些与击键。但请注意,它遵循VB6的使用,您无法看到用于导航的按键类型。像光标键和Tab键,Escape键和Enter键对应一个对话框。不是ProcessCmdKey()的问题。

http://stackoverflow.com/questions/2386695/disadvantage-of-setting-form-keypreview-true

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.net – 设置Form.KeyPreview = true的缺点