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

本文关键字:控件 TextBox 冒泡 包含 WPF 何阻止 KeyDown 事件 | 更新日期: 2023-09-27 18:14:02

我的程序相当大,并且使用WPF,我想有一个使用'R'的全局快捷键,没有修饰符。
有许多控件,如TextBox, ListBox, ComboBox等,都在控件本身使用字母,这是好的-这对我来说是正确的。
但是- 我想保持KeyDown事件从冒泡到主窗口,在那里它会触发快捷方式任何时候用户在文本框中输入字母'R',例如。
理想情况下,我希望能够做到这一点,而不必指定(并执行if-then逻辑)每个实例/类型的控件,可能会接受正常的字母键(不只是TextBox控件,尽管它们是最严重的违规者)。

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

只需检查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,尝试在你的窗口上的KeyDownPreviewKeyDown事件中设置e.Handled = true,而不是单独的控件。无论如何,我认为OriginalSource是你答案的关键。(我发誓这不是双关语)。

当你处理KeyDown事件时,它应该传递给你一个KeyEventArgs。从那里,你可以设置Handledtrue,这样它就不会冒泡了。

示例

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