Моя відповідь не стосується вищезазначеного питання безпосередньо, однак, я вважаю, що його формулювання призвело до того, що воно стало "Питанням" про програмне позбавлення від фокусу. Поширений сценарій, коли це потрібно, полягає в тому, щоб користувач міг очистити фокус, клацнувши лівою кнопкою миші фон кореневого елемента керування, наприклад вікна.
Отже, для досягнення цього ви можете створити вкладену поведінку, яка переведе фокус на динамічно створений елемент керування (у моєму випадку порожня мітка). Переважно використовувати таку поведінку на елементах найвищого рівня, таких як вікна, оскільки вона перебирає через своїх дітей, щоб знайти панель, до якої можна додати фіктивну мітку.
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();
}
}