Mi respuesta no aborda directamente la pregunta anterior, sin embargo, creo que su redacción ha hecho que se convierta en "La pregunta" sobre cómo deshacerse del enfoque mediante programación. Un escenario común donde esto es necesario es que el usuario pueda despejar el enfoque al hacer clic con el botón izquierdo en el fondo de un control raíz, como una ventana.
Entonces, para lograr esto, puede crear un comportamiento adjunto que cambiará el enfoque a un control creado dinámicamente (en mi caso, una etiqueta vacía). Es preferible usar este comportamiento en los elementos de más alto nivel como ventanas, ya que recorre sus elementos secundarios para encontrar un panel al que pueda agregar una etiqueta ficticia.
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();
}
}