web-dev-qa-db-fra.com

WPF réinitialiser la mise au point sur le bouton clic

J'ai un TextBox et un ToolBar avec un Button. Si je tape dans le TextBox _ et je clique sur le Button je veux que le TextBox perde Focus afin que la contraignante soit mise à jour. Je ne veux pas ajouter un UpdateSourceTrigger=PropertyChanged à mon TextBox. Mais au lieu de cela, lorsque je clique sur le Button i Réinitialiser _ i Focus à la fenêtre principale, alors que je suis toujours sur perd Focus et met à jour les reliures.

J'ai essayé d'ajouter un OnClick sur le bouton avec ce qui suit, mais cela ne semble pas fonctionner:

    private void Button_Click(object sender, RoutedEventArgs e) {
        FocusManager.SetFocusedElement(this, null);
    }

Des conseils seraient appréciés.

Merci, raul

35
HaxElit

Le problème est que la barre d'outils place votre bouton dans un autre FocusManager.FocusScope. Cela signifie que le Button et le TextBox peuvent recevoir la mise au point logique en même temps, chacune de sa propre portée. Ceci est normalement une bonne chose, puisque vous ne voulez généralement pas perdre votre objectif dans votre zone de fenêtre principale lorsque vous sélectionnez des éléments de menu et des boutons de la barre d'outils, mais dans votre cas, il empêche ce que vous faites de votre travail.

Bien que vous puissiez remplacer la propriété FocusManager.IsFocusScope sur la barre d'outils et obtenir l'effet que vous souhaitez, ce n'est probablement pas le meilleur plan puisqu'il permettrait à toutes les autres boutons de la barre d'outils Volez également la mise au point de votre zone principale.

Au lieu de cela, vous pouvez utiliser l'une des solutions simples:

  • Placez votre bouton à l'extérieur de la barre d'outils
  • Ajoutez un contrôle concentable = "vrai" à votre zone de la fenêtre principale et concentrez-la lorsque le bouton est cliqué sur le bouton.
  • Forcer manuellement la mise à jour en appelant textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
  • Définissez temporairement SIGNABLY = "TRUE" sur une commande dans la fenêtre principale, définissez la mise au point sur celle-ci, puis définissez immédiatement la mise au point = "FALSE"
25
Ray Burns

J'ai rencontré un problème similaire. Je dois éliminer une zone de texte lorsque l'entrée est enfoncée. Je finis avec ce code:

var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus
FocusManager.SetFocusedElement(scope, null); // remove logical focus
Keyboard.ClearFocus(); // remove keyboard focus

Je pense qu'il est plus propre que de créer des contrôles factices et il est réutilisable. Je ne suis pas confiant avec cette solution cependant. Mais cela semble bien fonctionner.

33
Dudu