Мой ответ не затрагивает вышеуказанный вопрос напрямую, однако я чувствую, что его формулировка заставила его стать «Вопросом» о программном избавлении от фокуса.Обычный сценарий, в котором это необходимо, заключается в том, чтобы пользователь мог фокусироваться на щелчке левой кнопкой мыши по фону корневого элемента управления, например окна.
Итак, для достижения этого вы можете создать присоединенное поведение,переключит фокус на динамически созданный элемент управления (в моем случае пустую метку).Желательно использовать это поведение на элементах самого высокого уровня, таких как окна, поскольку он перебирает свои дочерние элементы, чтобы найти панель, к которой можно добавить фиктивную метку.
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();
}
}