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