I need to have logic to handle an element's GotKeyboardFocus event and distinguish whether it was triggered by the Tab key or by some other way. But I know there is only the generalized event GotKeyboardFocus. How can I detect if the focus was received by pressing the Tab key inside the event handler method? Or is there another event?
            Asked
            
        
        
            Active
            
        
            Viewed 833 times
        
    1
            
            
        
        Jon Schneider
        
- 25,758
 - 23
 - 142
 - 170
 
        Виталий Семененя
        
- 67
 - 1
 - 7
 
- 
                    1It might be helpful to know why you want to use different logic. – OldBoyCoder Mar 20 '19 at 11:22
 - 
                    @OldBoyCoder Yes, for example , this event is invoked when modal window closed and mouse cursor is above textbox, in this case there is no need for doing something – Виталий Семененя Mar 20 '19 at 11:26
 - 
                    I'm not a WPF expert but I see that the KeyboardFocusChangedEventArgs parameter to the event has a Device property (https://learn.microsoft.com/en-us/dotnet/api/system.windows.input.inputeventargs.device?view=netframework-4.7.2#System_Windows_Input_InputEventArgs_Device). Is that any use? The alternative is setting some global in your modal close event that could be detected in the GotKeyboardFocus – OldBoyCoder Mar 20 '19 at 12:05
 - 
                    You have to do it manually. Simply [track](https://stackoverflow.com/q/4428100/1997232) the focus. Reset it when dialog is popping up. – Sinatr Mar 20 '19 at 12:23
 
1 Answers
3
            You have to subscribe to the GotFocus or GotKeyboardfocus event and then check for pressed keys:
<TextBox GotFocus="UIElement_OnGotFocus"/> 
In the handler:
if (Keyboard.PrimaryDevice.IsKeyDown(Key.Tab))
{
  // Do something when Tab is pressed
}
Maybe you like to extend the TextBox class to handle this event without attaching eventhandlers in XAML.
public class CustomTextBox : TextBox
{
  protected override void OnGotFocus (System.Windows.RoutedEventArgs e)
  {
    if (Keyboard.PrimaryDevice.IsKeyDown(Key.Tab))
    {
      // Do something when Tab is pressed
    }
  }
}
        BionicCode
        
- 1
 - 4
 - 28
 - 44