Interpret enter as tab WPF

I got around woodyiii's issue by adding a FrameworkElement.Tag (whose value is IgnoreEnterKeyTraversal) to certain elements (buttons, comboboxes, or anything I want to ignore the enter key traversal) in my XAML. I then looked for this tag & value in the attached property. Like so:

    if (e.Key == Key.Enter)
    {
        if (ue.Tag != null && ue.Tag.ToString() == "IgnoreEnterKeyTraversal")
        {
            //ignore
        }
        else
        {
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }

Based on Richard Aguirre's answer, which is better than the selected answer for ease of use, imho, you can make this more generic by simply changing the Grid to a UIElement.

To change it in whole project you need to do this

  • In App.xaml.cs:

     protected override void OnStartup(StartupEventArgs e)
     {           
         EventManager.RegisterClassHandler(typeof(UIElement), UIElement.PreviewKeyDownEvent, new KeyEventHandler(Grid_PreviewKeyDown));
         base.OnStartup(e);
     }
    
     private void Grid_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
     {
         var uie = e.OriginalSource as UIElement;
    
         if (e.Key == Key.Enter)
         {
             e.Handled = true;
             uie.MoveFocus(
             new TraversalRequest(
             FocusNavigationDirection.Next));
         }
     }
    
  • Compile. And done it. Now you can use enter like tab. Note: This work for elements in the grid


You can use my EnterKeyTraversal attached property code if you like. Add it to the top-level container on a WPF window and everything inside will treat enter as tab:

<StackPanel my:EnterKeyTraversal.IsEnabled="True">
    ...
</StackPanel>