Parece que cuando se inicia una aplicación WPF, nada tiene foco.
Esto es muy extraño. Todos los demás marcos que he usado hacen exactamente lo que esperarías: pone el foco inicial en el primer control en el orden de tabulación. Pero he confirmado que es WPF, no solo mi aplicación: si creo una nueva ventana, y solo pongo un TextBox y ejecuto la aplicación, el TextBox no tendrá foco hasta que haga clic en él o presione Tab . Yuck
Mi aplicación actual es más complicada que solo un TextBox. Tengo varias capas de UserControls dentro de UserControls. Uno de esos UserControls tiene manejadores Focusable = "True" y KeyDown / KeyUp, y quiero que tenga el foco tan pronto como se abra mi ventana. Sin embargo, sigo siendo un novato de WPF y no tengo mucha suerte para descubrir cómo hacerlo.
Si inicio mi aplicación y presiono la tecla Tab, el foco se dirige a mi control enfocable y comienza a funcionar de la manera que quiero. Pero no quiero que mis usuarios tengan que presionar Tab antes de que puedan comenzar a usar la ventana.
He jugado con FocusManager.FocusedElement, pero no estoy seguro de en qué control configurarlo (la ventana de nivel superior? El padre que contiene el control enfocable? El control enfocable en sí mismo) o en qué configurarlo.
¿Qué debo hacer para que mi control profundamente anidado tenga el foco inicial tan pronto como se abra la ventana? O mejor aún, ¿enfocar el primer control enfocable en el orden de tabulación?
Tuve la brillante idea de buscar en Reflector para ver dónde se usa la propiedad Focusable, y encontré el camino hacia esta solución. Solo necesito agregar el siguiente código al constructor de mi ventana:
Esto seleccionará automáticamente el primer control en el orden de tabulación, por lo que es una solución general que debería poder colocarse en cualquier ventana y Just Work.
fuente
Button
. Para solucionar esto, volteo laMoveFocus
llamada al despachador conContextIdle
prioridad (Background
o superior no funciona). Además, hay unaFocusNavigationDirection.First
que coincide mejor con la intención y hace lo mismo en este caso.Basado en la respuesta aceptada implementada como un comportamiento adjunto:
Úselo así:
fuente
DependencyProperty.RegisterAttached
. El tercer parámetro debería sertypeof(FocusBehavior)
, notypeof(Control)
. Hacer este cambio evitará que el diseñador informe la propiedad 'FocusFirst' ya registrada por errores de 'Control'.Encontré otra posible solución. Mark Smith publicó una extensión de marcado FirstFocusedElement para usar con FocusManager.FocusedElement.
fuente
Después de tener una 'pesadilla de enfoque inicial de WPF' y basarme en algunas respuestas en la pila, lo siguiente demostró que era la mejor solución.
Primero, agregue su App.xaml OnStartup () lo siguiente:
Luego agregue el evento 'WindowLoaded' también en App.xaml:
El problema de subprocesos debe usarse ya que el enfoque inicial de WPF falla principalmente debido a algunas condiciones de carrera marco.
Encontré la siguiente solución mejor, ya que se usa globalmente para toda la aplicación.
Espero eso ayude...
Orán
fuente
BeginInvoke
lugar de esaSleep(100)
declaración de miedo .Tenía el mismo problema resuelto con una solución simple: en la ventana principal:
En el control del usuario:
fuente
Puede tener fácilmente el control configurado como el elemento enfocado en XAML.
Nunca he intentado configurar esto en un control de usuario y ver si funciona, pero puede funcionar.
fuente
Una versión mínima de la respuesta de Mizipzor para C # 6+.
Use en su XAML:
fuente
Si eres como yo y estás usando algunos marcos que, de alguna manera, alteran los comportamientos básicos de enfoque y hacen que todas las soluciones anteriores sean irrelevantes, aún puedes hacer esto:
1 - Tenga en cuenta el elemento que obtiene el foco (¡lo que sea!)
2 - Agregue esto en su código detrás de xxx.xaml.cs
3 - Agregue esto en el elemento que obtiene el primer foco:
4 - Agregue el método Element_GotFocus en el código detrás y especifique el elemento con nombre WPF que necesita el primer foco:
5 - Administrar el evento cargado
en XAML
en xaml.cs
Espero que esto ayude como solución de último recurso
fuente
También enfrenté el mismo problema. Tenía tres cuadros de texto dentro del contenedor de lienzo y quería que el primer cuadro de texto se enfocara cuando se abre el control de usuario. El código WPF siguió el patrón MVVM. Creé una clase de comportamiento separada para enfocar el elemento y lo vinculé a mi punto de vista de esta manera.
Código de comportamiento del lienzo
Código para ver
fuente
La solución anterior no funcionó como se esperaba para mí, he cambiado ligeramente el comportamiento propuesto por Mizipzor de la siguiente manera:
De esta parte
A esto
Y no estoy adjuntando este comportamiento a Window o UserControl, pero para controlar quiero enfocarme inicialmente, por ejemplo:
Oh, perdón por diferentes nombres, estoy usando el nombre InitialFocus para la propiedad adjunta.
Y esto está funcionando para mí, tal vez podría ayudar a alguien más.
fuente
fuente