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?
En XAML:
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}">
<TextBox Name="Box" />
</StackPanel>
essayer FocusManager.SetFocusedElement
FocusManager.SetFocusedElement(parentElement, txtCompanyID)
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();
}
}
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.
Essayez ceci: MyTextBox.Focus ( );
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}" />
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.
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.