Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I stop WPF KeyDown events from bubbling up from certain contained controls (such as TextBox)?

My program is quite large, and uses WPF, and I want to have a global shortcut key that uses 'R', with no modifiers.
There are many controls such as TextBox, ListBox, ComboBox, etc. that all use letters inside the control itself, which is fine - that's correct for me.
But - I want to keep that KeyDown event from bubbling up to the main window, where it would trigger the shortcut any time a user is typing the letter 'R' in a TextBox, for example.
Ideally, I would like to be able to do this without having to specify (and do if-then logic on) every instance/type of control that might receive normal alphabetical key presses (not just the TextBox controls, though they are the worst offenders).

like image 685
redroze Avatar asked Jul 21 '14 19:07

redroze


2 Answers

Simply check what the OriginalSource is in your KeyDown event handler on the Window:

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

Or if you are using InputBindings, experiment with setting e.Handled = true in either the KeyDown or the PreviewKeyDown event on your Window, rather than the individual controls. In anyway, I think OriginalSource is the key to your answer. (I swear that was not a pun).

like image 122
Troels Larsen Avatar answered Oct 24 '22 17:10

Troels Larsen


There is an event when you handle KeyDown event and it should pass you a KeyEventArgs. From there you can set the Handled to true so that it won't bubble up.

Sample

private void TextBoxEx_KeyAction(object sender, KeyEventArgs e)
{
  e.Handled = true;
}
like image 43
123 456 789 0 Avatar answered Oct 24 '22 15:10

123 456 789 0