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();
}
}
Keyboard.ClearFocus()
desde el código subyacente después de hacer clic en alguna parte.ClearFocus
haceGotFocus
que no se dispare para el control enfocado recientemente mientras aún dispara para otros controles. Ese es un gran problema para mi teclado en pantalla personalizado, por ejemplo. Hace que el símbolo de intercalación desaparezca, que es probablemente todo lo que implica el "enfoque del teclado". Quizás estoy más interesado en algo como "enfoque del mouse".other.Focus()
.GotFocus
evento). Siempre hay algo con un enfoque lógico en su programa. Utilice elLostKeyboardFocus
evento o cambie el enfoque a otro elemento (que cambia el enfoque lógico junto con él) antes de borrar el enfoque del teclado.