Prefiero este enfoque a los demás anteriores, ya que se mantiene en línea con MVVM.
Todd Sprang
1
El elemento enfocado es de solo lectura correcto ¿Cómo se puede configurar en xaml? Usé esto y no funcionó <Style.Triggers> <Trigger Property = "Validation.HasError" Value = "True"> <Setter Property = "FocusManager.FocusedElement" Value = "{Binding Source = {RelativeSource Self}}" /> </Trigger> </Style.Triggers>
Esto solo funciona una vez. Si desea cambiar el enfoque después de que se haya creado la página, debe hacerlo mediante programación.
Joe Steele
esto también funciona. txtCompanyID.Focusable = true; Keyboard.Focus (txtCompanyID);
MindRoasterMir
51
Nadie explicó hasta ahora por qué el código de la pregunta no funciona. Supongo que el código se colocó en el constructor de la ventana. Pero en este momento es demasiado pronto para establecer el enfoque. Debe realizarse una vez que la ventana esté lista para la interacción. El mejor lugar para el código es el evento Loaded:
Lógicamente cierto, después de demasiada lucha, esta respuesta es bastante buena y perfecta como solución.
shivani
esto funcionó para mí. la respuesta aceptada no lo hizo. Gracias
BoundForGlory
No estoy seguro de si la versión es específica, pero Focus()requiere el parámetro de estado de enfoque, por ejemplotxtCompanyId.Focus(FocusState.Keyboard)
Solo puede haber un elemento en todo el escritorio que tenga el foco del teclado. En WPF, el elemento que tiene el foco del teclado tendrá IsKeyboardFocused establecido en verdadero.
Puede romper después de la línea de ajuste y verificar el valor de la IsKeyboardFocusedpropiedad. También verifique si realmente llega a esa línea o tal vez establece algún otro elemento para enfocarse después de eso.
Esto también funcionó para mí. El resto no lo fue. Gracias por el enlace, eso fue bastante interesante. También es interesante que algo tan simple pueda ser tan complicado.
TravisWhidden
2
La respuesta anterior funciona bien independientemente de si el contenedor es un Gird o un StackPanel. Dado que la estructura de su cuadrícula no está clara, es difícil saber qué pudo haber salido mal. Aunque es bueno ver alternativas.
útilBee
1
Para mí, este también es el único que funciona correctamente. Buena manera.
OregonGhost
7
En caso de que no haya encontrado la solución en las otras respuestas, así es como resolví el problema.
Por lo que entiendo, es posible que las otras soluciones no funcionen porque la llamada a Focus()se invoca antes de que la aplicación haya procesado los otros componentes.
Respuestas:
En XAML:
fuente
Nadie explicó hasta ahora por qué el código de la pregunta no funciona. Supongo que el código se colocó en el constructor de la ventana. Pero en este momento es demasiado pronto para establecer el enfoque. Debe realizarse una vez que la ventana esté lista para la interacción. El mejor lugar para el código es el evento Loaded:
fuente
Focus()
requiere el parámetro de estado de enfoque, por ejemplotxtCompanyId.Focus(FocusState.Keyboard)
prueba FocusManager.SetFocusedElement
fuente
msdn:
Puede romper después de la línea de ajuste y verificar el valor de la
IsKeyboardFocused
propiedad. También verifique si realmente llega a esa línea o tal vez establece algún otro elemento para enfocarse después de eso.fuente
Prueba esto :
MyTextBox.Focus ( );
fuente
Nada de esto funcionó para mí ya que estaba usando una cuadrícula en lugar de un StackPanel.
Finalmente encontré este ejemplo: http://spin.atomicobject.com/2013/03/06/xaml-wpf-textbox-focus/
y lo modificó a esto:
En la sección 'Recursos':
En mi definición de cuadrícula:
fuente
En caso de que no haya encontrado la solución en las otras respuestas, así es como resolví el problema.
Por lo que entiendo, es posible que las otras soluciones no funcionen porque la llamada a
Focus()
se invoca antes de que la aplicación haya procesado los otros componentes.fuente
Otra posible solución es utilizar FocusBehavior proporcionado por DevExpress MVVM Framework gratuito :
Le permite enfocar un control cuando está cargado, cuando se genera un evento determinado o se cambia una propiedad.
fuente
En Code behind, solo puedes lograrlo haciendo esto.
Nota: no funcionará antes de que se cargue la ventana
fuente