c# - two - WPF Restablecer el foco en el clic del botón
wpf binding textbox (2)
Tengo un TextBox
y una ToolBar
con un Button
. Si escribo en el TextBox
y hago clic en el Button
, quiero que el TextBox
de TextBox
pierda el Focus
para que el enlace se actualice. No quiero agregar un UpdateSourceTrigger=PropertyChanged
a mi TextBox
. Pero, en cambio, cuando hago clic en el Button
, reinicio el Focus
en la ventana principal, de modo que lo que sea que esté encendido pierde Focus
y actualiza los enlaces.
He intentado agregar un OnClick
al botón con lo siguiente, pero parece que no funciona:
private void Button_Click(object sender, RoutedEventArgs e) {
FocusManager.SetFocusedElement(this, null);
}
Cualquier consejo sería apreciado.
Gracias, Raul
El problema es que la barra de herramientas coloca su botón en un FocusManager.FocusScope
diferente. Eso significa que tanto el Button
como el TextBox
pueden recibir un enfoque lógico al mismo tiempo, cada uno en su propio ámbito. Esto normalmente es algo bueno, ya que generalmente no desea perder el enfoque en el área de su ventana principal cuando selecciona los elementos del menú y los botones de la Barra de herramientas, pero en su caso impide que funcione lo que está haciendo.
Aunque podría anular la propiedad FocusManager.IsFocusScope
en la barra de herramientas y obtener el efecto que desea, probablemente este no sea el mejor plan ya que haría que todos los demás botones de la barra de herramientas también roban el foco del área de la ventana principal.
En su lugar, podría usar una de varias soluciones fáciles:
- Pon tu botón fuera de la barra de herramientas
- Agregue un control Focusable = "true" al área de su ventana principal y concéntrelo cuando se haga clic en el botón
-
textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
manualmente la actualización llamando atextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource()
- Ajuste temporalmente Focusable = "true" en un control en la ventana principal, establezca el foco en él, luego configure inmediatamente Focusable = "false" nuevamente
Encontré un problema similar. Necesito desenfocar un cuadro de texto cuando se presiona enter. Termino con este código:
var scope = FocusManager.GetFocusScope(elem); // elem is the UIElement to unfocus
FocusManager.SetFocusedElement(scope, null); // remove logical focus
Keyboard.ClearFocus(); // remove keyboard focus
Creo que es más limpio que crear controles ficticios y es reutilizable. Sin embargo, no estoy seguro con esta solución. Pero parece funcionar bien.