Ejemplo de navegación UWP y centrándose en el control.

Utilizo el ejemplo de navegación uwp como ejemplo para la navegación de mi aplicación. Necesito poner el foco en TextBox. Lo bash en el ejemplo de navegación uwp . Para BasicPage agrego este código:

    public BasicPage() { this.InitializeComponent(); this.Loaded += BasicPage_Loaded; } private void BasicPage_Loaded(object sender, RoutedEventArgs e) { Test1.Focus(FocusState.Programmatic); } 

Test1 no recibe el foco. Intento este código en una aplicación universal de Windows “normal” – es trabajo. ¿Qué recomiendas?

Es porque la función Focus se llama en otro lugar después de llamar a Test1.Focus.

En AppShell.xaml.cs, puedes encontrar el siguiente código:

 private void OnNavigatedToPage(object sender, NavigationEventArgs e) { // After a successful navigation set keyboard focus to the loaded page if (e.Content is Page && e.Content != null) { var control = (Page)e.Content; control.Loaded += Page_Loaded; } } private void Page_Loaded(object sender, RoutedEventArgs e) { ((Page)sender).Focus(FocusState.Programmatic); ((Page)sender).Loaded -= Page_Loaded; this.CheckTogglePaneButtonSizeChanged(); } 

El código anterior significa que cuando navega a una página, suscribirá el evento cargado de la página y establecerá el enfoque en la página.

Su código suscribe el evento de la página cargada en la propia página. Y su código se ejecutará antes de la función Page_Loaded en AppShell. Así que no conseguiste lo que querías.

Por lo tanto, si simplemente comenta ((Page)sender).Focus(FocusState.Programmatic); en la función Page_Loaded. Obtendrá lo que quiere. No estoy seguro de cuál es el propósito exacto de esa línea. Pero todo parece bien.

Si encuentra algo mal después de comentar esa línea, también podemos solucionarlo. Llame a la función de enfoque una vez en el evento LayoutUpdated después del evento cargado.

 public sealed partial class BasicPage : Page { bool bAfterLoaded = false; public BasicPage() { this.InitializeComponent(); this.Loaded += BasicPage_Loaded; this.LayoutUpdated += BasicPage_LayoutUpdated; } private void BasicPage_LayoutUpdated(object sender, object e) { if (bAfterLoaded) { Test1.Focus(FocusState.Programmatic); bAfterLoaded = !bAfterLoaded; } } private void BasicPage_Loaded(object sender, RoutedEventArgs e) { bAfterLoaded = !bAfterLoaded; } } 

Espero que esto le pueda ayudar.

Si quieres enfocar un cuadro de texto programáticamente. Evitar que se muestre el teclado para que el evento layoutupdate no se active. Puede hacer algo como entonces en el evento page_loaded hacer Test1.Focus (FocusState.Programmatic);