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


105

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

J'ai ce code:

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

...Mais ça ne fonctionne pas.

Une idée?


txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID); ça marche mais c'est comme ça.
MindRoasterMir

Réponses:


146

En XAML:

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

9
Je préfère cette approche aux autres ci-dessus car elle reste conforme à MVVM.
Todd Sprang

1
L'élément focalisé est en lecture seule Comment pouvez-vous définir en xaml? J'ai utilisé ceci et cela n'a pas fonctionné <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
WPFKK

@ user841612, vérifiez le lien suivant et vérifiez l' assembly
...

Cela ne fonctionne qu'une seule fois. Si vous souhaitez modifier le focus après la création de la page, vous devez le faire par programme.
Joe Steele

cela fonctionne aussi. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir

51

Personne n'a expliqué jusqu'à présent pourquoi le code de la question ne fonctionne 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 se concentrer. 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();
  }
}

1
logiquement vrai, après trop de lutte, cette réponse est plutôt bonne et parfaite comme solution.
shivani

cela a fonctionné pour moi. la réponse acceptée n'a pas. Thanks
BoundForGlory

Je ne sais pas si la version est spécifique, mais Focus()nécessite un paramètre d'état de mise au point - par exempletxtCompanyId.Focus(FocusState.Keyboard)
Dan


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

msdn:

Il ne peut y avoir qu'un seul élément sur l'ensemble du bureau qui a le focus clavier. Dans WPF, l'élément qui a le focus clavier aura IsKeyboardFocused défini sur true.

Vous pouvez interrompre après la ligne de réglage et vérifier la valeur de la IsKeyboardFocusedpropriété. Vérifiez également si vous atteignez vraiment cette ligne ou si vous définissez un autre élément pour vous concentrer après cela.


19

Essaye ça : MyTextBox.Focus ( );


2
C'est la réponse la plus élégante et il n'est pas nécessaire que vous spécifiiez également le parent. Merci pour cela, cela fonctionne très bien pour moi!
dbeachy1

La réponse de Peter Huber fait cela mais explique que la fenêtre doit être chargée en premier, c'est pourquoi la mienne ne fonctionnait pas
Adriaan Davel

14

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é en 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 grille:

<Grid Style="{StaticResource FocusTextBox}" />

3
Cela a fonctionné pour moi aussi. Le reste ne l'était pas. Merci pour le lien, c'était assez intéressant. Aussi intéressant qu'une chose aussi simple puisse être si compliquée.
TravisWhidden

2
La réponse ci-dessus fonctionne correctement, que le conteneur soit un Gird ou un StackPanel. Comme la structure de votre grille n'est pas claire, il est difficile de dire ce qui aurait pu mal tourner. C'est bien de voir des alternatives cependant.
utileBee

1
Pour moi, c'est aussi le seul à fonctionner correctement. Belle façon.
OregonGhost

7

Au cas où vous n'auriez pas trouvé la solution sur les autres réponses, c'est ainsi que j'ai résolu le problème.

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

D'après ce que je comprends, les autres solutions peuvent ne pas fonctionner car l'appel à Focus()est appelé avant que l'application n'ait rendu les autres composants.


3
Cette réponse mérite un meilleur classement.
Simon Mourier

0

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

<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 certain événement est déclenché ou qu'une propriété est modifiée.


0

Dans Code behind, vous ne pouvez y parvenir qu'en faisant cela.

 private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            txtIndex.Focusable = true;
            txtIndex.Focus();
        }

Remarque: cela ne fonctionnera pas avant le chargement de la fenêtre

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.