Moving to next control on Enter keypress in WPF

前端 未结 7 2079
梦毁少年i
梦毁少年i 2020-11-30 23:20

I want to move to the next control when I press the Enter key instead of the Tab key in a WPF MVVM application. How can I achieve this?

7条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-30 23:46

    Below is an attached property that I've used for just this.

    First, example usage:

    
    

    (UI is the namespace alias for where I've defined the following.)

    The attached property:

    public static class FocusAdvancement
    {
        public static bool GetAdvancesByEnterKey(DependencyObject obj)
        {
            return (bool)obj.GetValue(AdvancesByEnterKeyProperty);
        }
    
        public static void SetAdvancesByEnterKey(DependencyObject obj, bool value)
        {
            obj.SetValue(AdvancesByEnterKeyProperty, value);
        }
    
        public static readonly DependencyProperty AdvancesByEnterKeyProperty =
            DependencyProperty.RegisterAttached("AdvancesByEnterKey", typeof(bool), typeof(FocusAdvancement), 
            new UIPropertyMetadata(OnAdvancesByEnterKeyPropertyChanged));
    
        static void OnAdvancesByEnterKeyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var element = d as UIElement;
            if(element == null) return;
    
            if ((bool)e.NewValue) element.KeyDown += Keydown;
            else element.KeyDown -= Keydown;
        }
    
        static void Keydown(object sender, KeyEventArgs e)
        {
            if(!e.Key.Equals(Key.Enter)) return;
    
            var element = sender as UIElement;
            if(element != null) element.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }
    

    You also said "instead of tab," so I'm wondering if you want to suppress the ability to use tab in the usual way. I'd advise against it, as it is a common, well known paradigm, but if that is the case, you can add a PreviewKeyDown handler in the attached property, check for the tab key, and set Handled = true for the event args.

提交回复
热议问题