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

red*_*oze 10 c# wpf event-bubbling

我的程序非常大,并且使用WPF,我希望有一个使用'R'的全局快捷键,没有修饰符.
有许多控件,如TextBox,ListBox,ComboBox等,都在控件内部使用字母,这很好 - 这对我来说是正确的.
但是 - 我希望保持KeyDown事件不会冒泡到主窗口,例如,当用户在TextBox中键入字母'R'时,它会触发快捷方式.
理想情况下,我希望能够做到这一点,而无需指定(并执行if-then逻辑)每个实例/控件类型可能接收正常的字母键按压(不仅仅是TextBox控件,尽管他们是最严重的违规者) ).

Tro*_*sen 10

只需按一下什么OriginalSource是你的KeyDown窗口事件处理程序:

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

或者,如果您正在使用InputBindings,请尝试e.Handled = true在Window上KeyDownPreviewKeyDown事件或事件中进行设置,而不是单个控件.无论如何,我认为OriginalSource是你答案的关键.(我发誓这不是双关语).

  • 将 `e.Handled` 设置为 `true` 绝对是正确的做法。第一个提议的解决方案实际上并不能防止冒泡。 (2认同)