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

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

只需检查Window上的KeyDown事件处理程序中的OriginalSource

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

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

处理KeyDown事件时会发生一个事件,它应该传递一个KeyEventArgs 。 从那里你可以将Handled设置为true,这样它就不会冒出来。

样品

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