Clavier.Focus ne fonctionne pas sur zone de texte dans WPF
Je suis cogner ma tête sur ce qui ressemble à un problème simple à résoudre dans wpf, mais je n'ai pas encore découvert pourquoi je ne peux pas obtenir mon appli pour se comporter selon mon plan.
J'ai une petite boîte de recherche qui apparaît dans mon application wpf quand l'utilisateur appuie sur ctrl+f. Tout ce que je veux est pour le signe à clignoter à l'intérieur de la zone de recherche zone de texte, prêts à prendre toutes les entrées utilisateur sans que l'utilisateur ait à cliquer sur elle. Voici le code xaml de la zone de texte qui est visible, activé, frappé testable, tabstopable et peut recevoir le focus.
<TextBox x:Name="SearchCriteriaTextBox" Text="{Binding SearchCriteria}" Focusable="True" IsEnabled="True" IsTabStop="True" IsHitTestVisible="True" Style="{DynamicResource SearchTextBoxStyle}" Grid.Column="1" Margin="5,10,0,5" />
Dans le code-behind, j'ai cette méthode est appelée lorsque la visibilité de la zone de recherche est affecté. la zone de recherche est chargé au démarrage de l'application.
///<summary>
///Handles events triggered from focusing on this view.
///</summary>
///<param name="sender">The sender.</param>
///<param name="dependencyPropertyChangedEventArgs">The key event args.</param>
private void OnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
if (!((bool) dependencyPropertyChangedEventArgs.NewValue))
{
return;
}
SearchCriteriaTextBox.Focus();
Keyboard.Focus(SearchCriteriaTextBox);
SearchCriteriaTextBox.Select(0, 0);
if (SearchCriteriaTextBox.Text.Length > 0)
{
SearchCriteriaTextBox.SelectAll();
}
}
Le problème est que le code est appelé, composant devient IsFocused=vrai, mais ne pas obtenir le focus clavier.
Ai-je raté quelque chose? À moins qu'un autre contrôle maintient son emprise férocement pour le focus clavier dont je suis assez sûr que je n'ai pas de code, pourquoi cette pièce de plutôt simple code ne fonctionnerait pas correctement.
Je suppose que l'autre contrôle de la prise de focus après cette méthode est appelée. Peut-être que vous devriez mettre l'accent dans un autre cas.
J'ai une question: est Chargé événement se déclenche à chaque fois que la visibilité des changements?
Nope. Il se déclenche lorsque le contrôle est chargé, mais puisque vous ne poste pas assez de code pour savoir comment êtes-vous de la création ou de montrer votre contrôle, je suis juste deviner.
Votre code pour OnIsVisibleChanged effectivement résolu mon problème!
OriginalL'auteur legrandviking | 2012-12-19
Vous devez vous connecter pour publier un commentaire.
Comme une solution de contournement, vous pouvez essayer d'utiliser le
Dispatcher
pour définir le focus à une plus tard DispatcherPriority, commeInput
À partir de la description de votre problème, il semble que vous n'avez pas le focus du Clavier set. WPF peut avoir plusieurs Focus Étendues, de sorte que plusieurs éléments peuvent avoir le Focus Logique (
IsFocused = true
), cependant qu'un élément peut avoir le Focus Clavier et recevra la saisie au clavier.Le code que vous avez posté devraient définir correctement le focus, si quelque chose doit se produire par la suite pour déplacer le Focus du Clavier de votre
TextBox
. Par la mise au point au plus tard, un répartiteur de priorité, vous serez en veillant à ce que le réglage de focus clavier à votreSearchCriteriaTextBox
se fait en dernier.Cela fonctionne pour moi: MessageBox.Afficher("foo"); myTextBox.Sélectionnez(0, myTextBox.Texte.La longueur); myTextBox.Focus();
Quelqu'un aurait-il une explication à ce problème?
J'ai tout essayé, de le Focus du Clavier pour le réglage de la peut recevoir le focus et la visibilité de vrai et puis l'appel de l'Accent, essayé aussi de FocusManager mais c'est la seule chose qui a fonctionné.
OUI!!! Enfin quelque chose qui a travaillé! Rachel, vous rock (encore).
OriginalL'auteur Rachel
Si ça aide quelqu'un, j'ai eu ce problème et que ma demande avait une fenêtre principale avec plusieurs contrôles utilisateur placés dans des réseaux séparés avec une visibilité de la liaison de données. Parce que les grilles étaient là quand la demande a été construit le .Focus() appelée sur la Chargée ou le Constructeur serait appelée au moment de la construction, pas à la visibilité de temps.
De toute façon, je l'ai corrigé en l'appelant .Focus() sur l'événement MouseEnter de la grille. Fonctionne très bien pour moi.
OriginalL'auteur Cristian G