WPF: comment supprimer le focus d’un TextBox par programme

Je veux append un comportement simple (du moins je le pensais) à mon WPF TextBox .

Lorsque l’utilisateur appuie sur Echap, je souhaite que le TextBox qu’il TextBox ait le texte qu’il avait lorsque l’utilisateur a commencé à éditer, et je veux supprimer le focus de TextBox .

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

Le problème est de supprimer le focus de l’élément. Je ne veux pas déplacer le focus vers un autre composant, je veux juste que le TextBox perd le focus. Dois-je avoir un élément invisible pour définir le focus afin que ma TextBox puisse perdre le focus?

dans .NET Framework 4, juste Keyboard.ClearFocus();

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); 

Un peu en retard à la fête, mais cela m’a aidé, alors voilà.

Depuis .Net 3.0, FrameworkElement a une fonction MoveFocus qui a fait l’affaire.

Vous pouvez définir le focus sur un ancêtre focalisable. Ce code fonctionnera même si la zone de texte se trouve dans un modèle sans ancêtres pouvant être focalisés à l’intérieur du 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); } 

Avant tout, il est impossible de supprimer complètement le focus. Quelque chose dans votre fenêtre aura toujours le focus.

Dans Windows Phone Development, je viens de faire Focus() ou this.Focus() dans le PhoneApplicationPage et cela fonctionnait comme un charme.

Keyboard.ClearFocus(); est la route.