web-dev-qa-db-fra.com

Définir le focus sur la zone de texte dans WPF

Comment définir le focus sur un élément TextBox dans WPF

J'ai ce code:

txtCompanyID.Focusable = true;
txtCompanyID.Focus();

...Mais ça ne fonctionne pas.

Une idée?

96
priyanka.sarkar

En XAML:

<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
   <TextBox Name="Box" />
</StackPanel>
131
usefulBee

essayer FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
49
Arsen Mkrtchyan

Jusqu'à présent, personne n'a expliqué pourquoi le code de la question ne fonctionnait pas. Je suppose que le code a été placé dans le constructeur de la fenêtre. Mais pour le moment, il est trop tôt pour mettre l'accent. Cela doit être fait une fois que la fenêtre est prête pour l'interaction. Le meilleur endroit pour le code est l'événement Loaded:

public KonsoleWindow() {
  public TestWindow() {
    InitializeComponent();
    Loaded += TestWindow_Loaded;
  }

  private void TestWindow_Loaded(object sender, RoutedEventArgs e) {
    txtCompanyID.Focus();
  }
}
48
Peter Huber
txtCompanyID.Focusable = true;
Keyboard.Focus(txtCompanyID);

msdn:

Il ne peut y avoir qu'un seul élément sur tout le bureau qui ait le focus clavier. Dans WPF, IsKeyboardFocused est défini sur true pour l'élément qui a le focus clavier.

Vous pourriez faire une pause après la ligne de paramètre et vérifier la valeur de la propriété IsKeyboardFocused. Vérifiez également si vous atteignez vraiment cette ligne ou si vous définissez un autre élément pour obtenir le focus ensuite.

22
Svetlozar Angelov

Essayez ceci: MyTextBox.Focus ( );

16
NazOok

Rien de tout cela n'a fonctionné pour moi car j'utilisais une grille plutôt qu'un StackPanel.

J'ai finalement trouvé cet exemple: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/

et l'a modifié pour ceci:

Dans la section 'Ressources':

    <Style x:Key="FocusTextBox" TargetType="Grid">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=textBoxName, Path=IsVisible}" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textBoxName}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

Dans ma définition de la grille:

<Grid Style="{StaticResource FocusTextBox}" />
12
Anya Hope

Au cas où vous n’auriez pas trouvé de solution aux autres réponses, c’est ainsi que j’ai résolu le problème.

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
  TEXTBOX_OBJECT.Focus();
}), DispatcherPriority.Render);

D'après ce que j'ai compris, les autres solutions risquent de ne pas fonctionner car l'appel à Focus() est appelé avant que l'application n'ait restitué les autres composants.

1
EasyJoin Dev

Une autre solution possible consiste à utiliser FocusBehavior fourni par Framework gratuit DevExpress MVVM :

<TextBox Text="This control is focused on startup">
    <dxmvvm:Interaction.Behaviors>
        <dxmvvm:FocusBehavior/>
    </dxmvvm:Interaction.Behaviors>
</TextBox>

Il vous permet de focaliser un contrôle lorsqu'il est chargé, lorsqu'un événement donné est déclenché ou qu'une propriété est modifiée.

0
Alex Russkov