代码之家  ›  专栏  ›  技术社区  ›  redroze

如何阻止WPF KeyDown事件从某些包含的控件(如TextBox)冒泡?

  •  14
  • redroze  · 技术社区  · 12 年前

    我的程序非常大,使用WPF,我希望有一个全局快捷键,使用“R”,不带修饰符。
    有许多控件,如TextBox、ListBox、ComboBox等,它们都在控件本身内部使用字母,这很好-这对我来说是正确的。
    但是- 我想防止KeyDown事件冒泡到主窗口 ,例如,当用户在TextBox中键入字母“R”时,它将触发快捷方式。
    理想情况下,我希望能够做到这一点,而不必指定(并启用if-then逻辑)每个可能接收正常字母键按压的控件实例/类型(不只是TextBox控件,尽管它们是最坏的违规者)。

    2 回复  |  直到 12 年前
        1
  •  17
  •   Troels Larsen    12 年前

    只需检查 OriginalSource 在您的 KeyDown 窗口上的事件处理程序:

    private void Window_KeyDown(object sender, KeyEventArgs e) {
        if(e.OriginalSource is TextBox || e.OriginalSource is DateTimePicker) //etc
        {
            e.Handled = true;
            return;
        }
    }
    

    或者,如果您正在使用InputBindings,请尝试设置 e.Handled = true 在 按下 或 PreviewKeyDown 事件,而不是单个控件。无论如何,我想 原始来源 是你答案的关键。(我发誓这不是双关语)。

        2
  •  1
  •   123 456 789 0    12 年前

    当你处理 KeyDown 事件,它应该会传递给你 KeyEventArgs 。从那里可以设置 Handled 到 真的 这样它就不会起泡。

    样品

    private void TextBoxEx_KeyAction(object sender, KeyEventArgs e)
    {
      e.Handled = true;
    }