Ma réponse ne répond pas directement à la question ci-dessus, cependant, je pense que le libellé de celui-ci l'a amenée à devenir "La question" sur la suppression programmatique de la concentration. Un scénario courant où cela est nécessaire est que l'utilisateur puisse effacer le focus en cliquant avec le bouton gauche sur l'arrière-plan d'un contrôle racine, comme une fenêtre.
Donc, pour y parvenir, vous pouvez créer un comportement attaché qui basculera le focus vers un contrôle créé dynamiquement (dans mon cas, une étiquette vide). Il est préférable d'utiliser ce comportement sur les éléments de plus haut niveau comme les fenêtres, car il parcourt ses enfants pour trouver un panneau auquel il peut ajouter une étiquette factice.
public class LoseFocusOnLeftClick : Behavior<FrameworkElement>
{
private readonly MouseBinding _leftClick;
private readonly Label _emptyControl = new Label() { Focusable = true, HorizontalAlignment = HorizontalAlignment.Left, VerticalAlignment = VerticalAlignment.Top };
public LoseFocusOnLeftClick()
{
_leftClick = new MouseBinding(new RelayCommand(LoseFocus), new MouseGesture(MouseAction.LeftClick));
}
protected override void OnAttached()
{
AssociatedObject.InputBindings.Add(_leftClick);
AssociatedObject.Loaded += AssociatedObject_Loaded;
}
protected override void OnDetaching()
{
AssociatedObject.InputBindings.Remove(_leftClick);
AssociatedObject.Loaded -= AssociatedObject_Loaded;
}
private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
{
AssociatedObject.Loaded -= AssociatedObject_Loaded;
AttachEmptyControl();
}
private void AttachEmptyControl()
{
DependencyObject currentElement = AssociatedObject;
while (!(currentElement is Panel))
{
currentElement = VisualTreeHelper.GetChild(currentElement, 0);
}
((Panel)currentElement).Children.Add(_emptyControl);
}
private void LoseFocus()
{
_emptyControl.Focus();
}
}