Pregunta

Tengo una aplicación similar a un navegador WPF con unas pocas páginas. Cuando cambio de página, me gustaría establecer el foco del teclado.

Cuando se carga una página por primera vez, esto funciona llamando a Control.Focus () en el constructor.

Pero cuando cambio de página, esto ya no funciona. El foco está solo en el primer campo, e ignora mis intentos de cambiarlo a cualquier otra cosa :(

Las páginas tienen el atributo KeepAlive = true ; estaría bien si eso mantuviera el enfoque vivo también, pero establecer el foco en el primer campo es molesto.

Intenté establecer el foco en el evento cargado, pero tampoco funcionó. Parece que el enfoque predeterminado se establece después de volver a cargar la página.

¿Hay alguna manera de establecer el enfoque en ingresar una página por segunda vez? ¿Cuándo, cómo y dónde debo establecer el enfoque al cambiar entre páginas WPF en una aplicación similar a un navegador ?

¿Fue útil?

Solución 4

Como no encontré una solución a este problema, utilicé una solución sencilla:

Enciendo un hilo secundario, que cambia el enfoque después de que la página se haya cargado.

Afortunadamente esto se hace muy fácilmente usando BeginInvoke:

myControl.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background, 
(System.Threading.SendOrPostCallback)delegate(object state) 
{ 
  myControl.Focus(); 
});

Esto funcionó mucho mejor de lo que esperaba, así que probablemente esta solución se mantendrá en uso durante mucho tiempo.

Otros consejos

Intente agregar FocusManager.FocusedElement = " {Binding ElementName = [...]} " `` al primer elemento de su página y establezca [...] el nombre del elemento que debe tener el foco.

¿Ha intentado establecer el foco en el controlador de eventos Loaded en lugar del constructor? Las páginas no se reconstruyen cuando vuelves a ellas, pero se recargan si recuerdo correctamente.

Después de tener una 'pesadilla de enfoque inicial de WPF' y en base a algunas respuestas en la pila, lo siguiente demostró ser la mejor solución.

Primero, agregue su App.xaml OnStartup () lo siguiente:

EventManager.RegisterClassHandler(typeof(Window), Window.LoadedEvent,
          new RoutedEventHandler(WindowLoaded));

Luego agregue el evento 'WindowLoaded' también en App.xaml:

void WindowLoaded(object sender, RoutedEventArgs e)
    {
        var window = e.Source as Window;
        System.Threading.Thread.Sleep(100);
        window.Dispatcher.Invoke(
        new Action(() =>
        {
            window.MoveFocus(new TraversalRequest(FocusNavigationDirection.First));

        }));
    }

El problema de los subprocesos debe usarse ya que el enfoque inicial de WPF falla en su mayoría debido a algunas condiciones de carrera del marco.

Encontré mejor la siguiente solución, ya que se usa globalmente para toda la aplicación.

Espero que ayude ...

Oran

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top