WPF and initial focus

后端 未结 12 2109
鱼传尺愫
鱼传尺愫 2020-11-29 15:59

It seems that when a WPF application starts, nothing has focus.

This is really weird. Every other framework I\'ve used does just what you\'d expect: puts initial foc

相关标签:
12条回答
  • 2020-11-29 16:17

    I found another possible solution. Mark Smith posted a FirstFocusedElement markup extension for use with FocusManager.FocusedElement.

    <UserControl x:Class="FocusTest.Page2"
        xmlns:FocusTest="clr-namespace:FocusTest"
        FocusManager.FocusedElement="{FocusTest:FirstFocusedElement}">
    
    0 讨论(0)
  • 2020-11-29 16:18

    If you are like me, and you are using some frameworks that, somehow, mess up with the basic focus behaviors, and make all solutions above irrelevant, you can still do this :

    1 - Note the element which get the focus (whatever it is!)

    2 - Add this in your code behind xxx.xaml.cs

    private bool _firstLoad;
    

    3 - Add this on the element which get the first focus :

    GotFocus="Element_GotFocus"
    

    4 - Add the Element_GotFocus method in the code behind, and specify the WPF named element who need the first focus :

    private void Element_GotFocus(object sender, RoutedEventArgs e)
    {
        if(_firstLoad)
        {
            this.MyElementWithFistFocus.Focus();
            _firstLoad = false;
        }
    }
    

    5 - Manage the Loaded event

    in XAML

    Loaded="MyWindow_Loaded"   
    

    in xaml.cs

    private void MyWindow_Loaded(object sender, RoutedEventArgs e)
    {
            _firstLoad = true;
            this.Element_GotFocus(null, null);
    }
    

    Hope this will help as a last resort solution

    0 讨论(0)
  • 2020-11-29 16:25

    I had the bright idea to dig through Reflector to see where the Focusable property is used, and found my way to this solution. I just need to add the following code to my Window's constructor:

    Loaded += (sender, e) =>
        MoveFocus(new TraversalRequest(FocusNavigationDirection.First));
    

    This will automatically select the first control in the tab order, so it's a general solution that should be able to be dropped into any window and Just Work.

    0 讨论(0)
  • 2020-11-29 16:25

    You can easily have the control set itself as the focused element in XAML.

    <Window>
       <DataGrid FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}">
         ...
       </DataGrid>
    </Window>
    

    I've never tried setting this in a usercontrol and seeing if this works, but it may.

    0 讨论(0)
  • 2020-11-29 16:26

    Based on the accepted answer implemented as an attached behavior:

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    
    namespace UI.Behaviors
    {
        public static class FocusBehavior
        {
            public static readonly DependencyProperty FocusFirstProperty =
                DependencyProperty.RegisterAttached(
                    "FocusFirst",
                    typeof(bool),
                    typeof(FocusBehavior),
                    new PropertyMetadata(false, OnFocusFirstPropertyChanged));
    
            public static bool GetFocusFirst(Control control)
            {
                return (bool)control.GetValue(FocusFirstProperty);
            }
    
            public static void SetFocusFirst (Control control, bool value)
            {
                control.SetValue(FocusFirstProperty, value);
            }
    
            static void OnFocusFirstPropertyChanged(
                DependencyObject obj, DependencyPropertyChangedEventArgs args)
            {
                Control control = obj as Control;
                if (control == null || !(args.NewValue is bool))
                {
                    return;
                }
    
                if ((bool)args.NewValue)
                {
                    control.Loaded += (sender, e) =>
                        control.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            }
        }
    }
    

    Use it like this:

    <Window xmlns:Behaviors="clr-namespace:UI.Behaviors"
            Behaviors:FocusBehavior.FocusFirst="true">
    
    0 讨论(0)
  • 2020-11-29 16:26
    <Window FocusManager.FocusedElement="{Binding ElementName=yourControlName}">
    
    0 讨论(0)
提交回复
热议问题