He tenido problemas con PreviewLostKeyboardFocus
que casi te lleva hasta allí. He visto un par de implementaciones usando LostFocus
, pero eso solo fuerza el enfoque en el TextBox
después de perder el foco y puede ver fácilmente este cambio en la pantalla. Básicamente, estoy buscando el mismo tipo de comportamiento que podría obtener usando OnValidating
en WinForms.¿Cuál es la mejor manera de evitar perder el foco de TextBox cuando hay un error de validación?
Respuesta
En mi opinión, la mejor manera es generalmente no hacerlo. Casi siempre es mejor desactivar los otros controles o evitar guardar hasta que el valor sea válido.
Pero si su diseño realmente necesita esta capacidad, esto es lo que debe hacer:
Intercepción la versión
Preview
de eventos de teclado y ratón a su nivel de la ventana, o cualquier ámbito que desee evitar los cambios de enfoque dentro (por ejemplo, tal vez no su barra de menú).cuando se detecta el KeyDown Tab o Retorno KeyDown del cuadro de texto, o cuando se detecta un MouseDown fuera del cuadro de texto, mientras que tiene el foco, llame UpdateSource() en la expresión de enlace, a continuación, si la validación ha fallado set Handled = true para evitar que el evento KeyDown o MouseDown se procese aún más.
También continúe manipulando
PreviewLostKeyboardFocus
para detectar cualquier causa de cambio de foco que no sea del teclado o del mouse, o que su otro código no reconoció.
cómo atrapar eventos de mouse globales (nivel de ventana)? Si tenemos un control de contenedor y enfoque, debe permanecer dentro del editor hasta que se pasen los datos válidos. –
Para añadir a la respuesta de Ray:
UpdateSource se llama así:
BindingExpression be = userTextbox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
También, como alternativa, se puede establecer la unión a la caja de texto:
UpdateSourceTrigger = "PropertyChanged";
Esto último causará una verificación continua, mientras que el primero comprobará cuando sea necesario (rendimiento).
Si intenta enfocar un elemento dentro de su propio manejador LostFocus se encontrará con una StackOverflowException, no estoy seguro sobre la causa raíz (sospecho que el tipo de foco rebota) pero hay una solución fácil: despacharla .
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
var element = (sender as TextBox);
if (!theTextBoxWasValidated())
{
// doing this would cause a StackOverflowException
// element.Focus();
var restoreFocus = (System.Threading.ThreadStart)delegate { element.Focus(); };
Dispatcher.BeginInvoke(restoreFocus);
}
}
A través Dispatcher.BeginInvoke a asegurarse de que la restauración del foco no se interpone en el camino de la pérdida en curso de enfoque (y evitar la excepción desagradable que le hace frente de otra manera)
- 1. ¿Cuál es la mejor manera de implementar restricciones de entrada en un TextBox en C#?
- 2. ¿Cuál es la mejor manera de evitar maven-jar?
- 3. Una manera de evitar perder memoria
- 4. Se perdió el formateo de TextBox cuando el foco cambia
- 5. TextBox - ¿Puedo mantener la selección resaltada cuando pierde el foco?
- 6. en el cambio sin perder el foco?
- 7. ¿Es posible hacer clic en un botón sin perder el foco en un cuadro de texto?
- 8. jQuery perder evento de foco
- 9. cómo invocar un evento después de perder el foco de un cuadro de texto, asp.net mvc
- 10. ¿Cuál es la mejor manera de evitar pasar un marco de datos?
- 11. ¿Cuál es la mejor manera de hacer la validación de entrada en C++ con cin?
- 12. jQuery: perder el foco en el elemento
- 13. ¿Cuál es la mejor manera de determinar un bucle invariante?
- 14. ¿Cuál es la mejor manera de implementar la validación de campo con ASP.NET MVC?
- 15. Cuál es la mejor manera de evitar pérdidas de memoria en la aplicación WPF PRISM/MVVM
- 16. ¿Cuál es la mejor manera de ampliar la funcionalidad?
- 17. ¿Cuál es la mejor manera de manejar objects.get de Django?
- 18. ¿Cuál es la mejor manera de permitir la cancelación de un formulario modal cuando hay una validación a nivel de campo?
- 19. ¿Cuál es la mejor manera de forzar el inicio de una aplicación cuando se recicla un grupo de aplicaciones?
- 20. ¿Cuál es la mejor manera de vaciar un directorio?
- 21. ¿Cuál es la mejor manera de validar datos en mongo?
- 22. ¿Cuál es la mejor manera de barajar un NSMutableArray?
- 23. ¿Cuál es la mejor manera de guardar los mejores puntajes en el iPhone para evitar piratear?
- 24. ¿Cuál es la mejor manera de liberar memoria después de regresar de un error?
- 25. ¿Cuál es la mejor manera de especificar un key_name para el modelo NDB de App Engine?
- 26. ¿Cuál es la mejor manera de probar el código GWT
- 27. ¿Cuál es la mejor manera de gestionar el cambio?
- 28. ¿Cuál es la mejor manera de evitar intentar ... atrapar ... finalmente ... en mis pruebas unitarias?
- 29. Evento de WinForms para el foco de TextBox?
- 30. ¿Cuál es la mejor manera de implementar un "temporizador"?
La captura de enfoque en un control puede conducir a una experiencia de usuario deficiente ... Solo asegúrese de dejar que los usuarios salgan de ese cuadro de diálogo/ventana fácilmente ... –