118 votes

WPF : Comment retirer le focus d'une TextBox de manière programmatique ?

Je souhaite ajouter un comportement simple (du moins je le croyais) à mon système WPF. TextBox .

Lorsque l'utilisateur appuie sur la touche Echap, je veux que la touche TextBox qu'il est en train d'éditer pour qu'il ait le texte qu'il avait lorsque l'utilisateur a commencé à l'éditer, ET je veux retirer le focus de l'écran de l'utilisateur. TextBox .

Je n'ai aucun problème à remettre le texte à la valeur qu'il avait au début de l'édition.

Le problème est de retirer le focus de l'élément. Je ne veux pas déplacer le focus vers un autre composant, je veux juste que l'élément TextBox pour perdre la mise au point. Devrai-je avoir un élément invisible pour définir la mise au point afin que mon site Web ne soit plus visible ? TextBox peut perdre sa concentration ?

175voto

LPL Points 9372

Dans .NET Framework 4 seulement Keyboard.ClearFocus();

1 votes

C'était exactement ce que je cherchais ce soir !

9 votes

Cela n'efface pas toujours le focus : J'ai un problème où une AutoCompleteTextBox à l'intérieur d'une ListBox ne perd pas le focus lorsque j'exécute la commande suivante Keyboard.ClearFocus() à partir du code-behind après un clic quelque part.

3 votes

ClearFocus causes GotFocus de ne pas se déclencher pour le contrôle récemment mis au point alors qu'il se déclenche toujours pour les autres contrôles. C'est un gros problème pour mon clavier à l'écran personnalisé, par exemple. Cela fait disparaître le signe d'insertion, ce qui est probablement tout ce que le "focus clavier" implique. Peut-être suis-je plus intéressé par quelque chose comme le "focus souris".

61voto

decasteljau Points 3305

Le code que j'ai utilisé :

// Move to a parent that can take focus
FrameworkElement parent = (FrameworkElement)textBox.Parent;
while (parent != null && parent is IInputElement && !((IInputElement)parent).Focusable)
{
    parent = (FrameworkElement)parent.Parent;
}

DependencyObject scope = FocusManager.GetFocusScope(textBox);
FocusManager.SetFocusedElement(scope, parent as IInputElement);

3 votes

Ce code est génial, mais Keyboard.ClearFocus() a des effets secondaires inattendus.

0 votes

Pourquoi la condition !((IInputElement)parent).Focusable a-t-elle un " !" devant ? Cette condition ne devrait-elle pas être vraie si le parent est focalisable ?

0 votes

Mert - je ne suis pas sûr, mais en parcourant ce post, on dirait que le but est de continuer à boucler jusqu'à ce que la condition soit vraie. De cette façon, le premier élément focalisable termine la boucle.

19voto

SuperOli Points 860

J'arrive un peu tard dans la soirée, mais cela m'a été utile, alors voilà.

Depuis .Net 3.0, FrameworkElement a un MoveFocus qui a fait l'affaire pour moi.

0 votes

Pour les instructions -> msdn.microsoft.com/fr/us/library/

0 votes

"Assurez-vous de vérifier la valeur de retour de cette méthode. Une valeur de retour de false peut être renvoyée si la traversée se heurte à un arrêt de tabulation défini par la composition d'un contrôle, et que la demande de traversée n'a pas demandé à envelopper." - msdn.microsoft.com/fr/us/library/

9voto

Julian Dominguez Points 1521

Vous pouvez mettre le focus sur un ancêtre focusable. Ce code fonctionnera même si la zone de texte se trouve dans un modèle sans ancêtres focalisables dans ce même modèle :

DependencyObject ancestor = textbox.Parent;
while (ancestor != null)
{
    var element = ancestor as UIElement;
    if (element != null && element.Focusable)
    {
        element.Focus();
        break;
    }

    ancestor = VisualTreeHelper.GetParent(ancestor);
}

6voto

bitbonk Points 14057

AFAIK, il n'est pas possible de supprimer complètement la mise au point. Quelque chose dans votre fenêtre aura toujours le focus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X