WPF: Cómo eliminar el foco de un TextBox mediante programación
focus (7)
Quiero agregar un comportamiento simple (al menos eso pensé) a mi WPF TextBox
.
Cuando el usuario presiona Escape, quiero que el TextBox
que está editando tenga el texto que tenía cuando el usuario comenzó a editar, Y quiero eliminar el foco del TextBox
.
No tengo ningún problema para configurar el texto para el valor que tenía al comienzo de la edición.
El problema es eliminar el foco del elemento. No quiero mover el foco a ningún otro componente, solo quiero que el TextBox
pierda el foco. ¿Tendré que tener un elemento invisible para establecer el foco para que mi TextBox
pueda perder el foco?
AFAIK, no es posible eliminar completamente el foco. Algo en su ventana siempre tendrá el foco.
El código que he estado usando:
// Move to a parent that can take focus
FrameworkElement parent = (FrameworkElement)textBox.Parent;
while (parent != null && parent is IInputElement && !((IInputElement)parent).Focusable)
{
parent = (FrameworkElement)parent.Parent;
}
DependencyObject scope = FocusManager.GetFocusScope(textBox);
FocusManager.SetFocusedElement(scope, parent as IInputElement);
En Windows Phone Development, acabo de hacer Focus()
o this.Focus()
en PhoneApplicationPage y funcionó a las mil maravillas .
Puedes establecer el foco en un ancestro enfocable. Este código funcionará incluso si el cuadro de texto está dentro de una plantilla sin ancestros enfocables dentro de la misma plantilla:
DependencyObject ancestor = textbox.Parent;
while (ancestor != null)
{
var element = ancestor as UIElement;
if (element != null && element.Focusable)
{
element.Focus();
break;
}
ancestor = VisualTreeHelper.GetParent(ancestor);
}
Un poco tarde para la fiesta, pero fue útil para mí, así que aquí va.
Desde .Net 3.0, FrameworkElement
tiene una función MoveFocus que me sirvió.
en .NET Framework 4 solo Keyboard.ClearFocus();
Keyboard.ClearFocus();
es el camino.