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

时间:2014-07-21 19:17:08

标签: c# wpf event-bubbling

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

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:0)

处理KeyDown事件时会发生一个事件,它会通过KeyEventArgs。从那里,您可以将Handled设置为 true ,以便它不会冒出来。

样品

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