我想知道Form.KeyPreview属性实际上有什么用?为什么存在它,将其设置为true会给我带来什么“风险”?我猜它一定有一些负面影响-否则它根本不应该存在(或者至少在默认情况下是真的)?

编辑:我完全知道它的作用。我问为什么选择。为什么必须将其设置为true才能触发键盘事件?为什么键盘事件不总是为表单触发。这不仅是标准行为吗?

我问的特殊原因是:我刚刚在我的应用程序的基本形式中设置了KeyPreview = true,所有其他形式都继承自该形式。我有什么讨厌的惊喜吗?

最佳答案

Form.KeyPreview有点过时,它是从Visual Basic对象模型继承来进行表单设计的。在VB6时代,您需要KeyPreview才能实现快捷键。 Windows窗体不再需要这种方法,重写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得到了支持,以帮助2000年早期的VB6程序员大批改用.NET。 KeyPreview或ProcessCmdKey()的重点是允许您的UI响应快捷键。键盘消息通常发送到具有焦点的控件。 Windows窗体消息循环允许代码在控件看到该消息之前对其进行窥视。这对于快捷键很重要,为每个可能引起焦点来检测它们的控件实现KeyDown事件是非常不切实际的。

将KeyPreview设置为True不会引起问题。窗体的KeyDown事件将运行,仅当它的代码执行击键操作时才会起作用。但是请注意,它紧跟VB6的用法,您看不到用于导航的击键类型。像光标键和Tab一样,退出并进入对话框。 ProcessCmdKey()没问题。

关于.net - 设置Form.KeyPreview = true的缺点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2386695/

10-09 13:46