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?

priyanka.sarkar
la source
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>
utileBee
la source
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();
  }
}
Peter Huber
la source
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
49

essayez FocusManager.SetFocusedElement

FocusManager.SetFocusedElement(parentElement, txtCompanyID)
Arsen Mkrtchyan
la source
5
Que faire si l'élément sur lequel vous souhaitez mettre le focus est l'élément parent oO?
Brock Hensley
10
FocusManager.SetFocusedElement (FocusManager.GetFocusScope (parentElement), parentElement);
Philter
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.

Svetlozar Angelov
la source
19

Essaye ça : MyTextBox.Focus ( );

NazOok
la source
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}" />
Anya Hope
la source
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.

anémomylos
la source
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.

Alex Russkov
la source
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

MindRoasterMir
la source