way two raisepropertychanged property change c# wpf data-binding button focus

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 a textBox.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.