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.
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:
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)
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.
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.
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.
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.
Réponses:
En XAML:
la source
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:
la source
Focus()
nécessite un paramètre d'état de mise au point - par exempletxtCompanyId.Focus(FocusState.Keyboard)
essayez FocusManager.SetFocusedElement
la source
msdn:
Vous pouvez interrompre après la ligne de réglage et vérifier la valeur de la
IsKeyboardFocused
proprié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.la source
Essaye ça :
MyTextBox.Focus ( );
la source
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':
Dans ma définition de grille:
la source
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.
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.la source
Une autre solution possible consiste à utiliser FocusBehavior fourni par DevExpress MVVM Framework gratuit :
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.
la source
Dans Code behind, vous ne pouvez y parvenir qu'en faisant cela.
Remarque: cela ne fonctionnera pas avant le chargement de la fenêtre
la source