Moja odpowiedź nie odnosi się bezpośrednio do powyższego pytania, jednak czuję, że jego brzmienie sprawiło, że stało się ono „pytaniem” o programowe pozbycie się koncentracji. Typowy scenariusz, w którym jest to potrzebne, polega na tym, że użytkownik może wyczyścić fokus po kliknięciu lewym przyciskiem myszy tła elementu sterującego głównego, takiego jak okno.
Aby to osiągnąć, możesz utworzyć dołączone zachowanie, które przełączy fokus na dynamicznie utworzoną kontrolkę (w moim przypadku pustą etykietę). Zaleca się używanie tego zachowania na elementach najwyższego poziomu, takich jak okna, ponieważ iteruje ono po swoich elementach potomnych, aby znaleźć panel, do którego może dodać fikcyjną etykietę.
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();
}
}