2015-11-09 17 views
5

Io uso uwp navigation example come esempio per la navigazione dell'applicazione. Devo concentrarmi su TextBox. Lo provo su uwp navigation example. Per BasicPage aggiungo questo codice:Esempio di navigazione Uwp e messa a fuoco sul controllo

<StackPanel Orientation="Vertical"> 
     <TextBox x:Name="Test" /> 
     <TextBox x:Name="Test1" /> 
    </StackPanel> 

    public BasicPage() 
    { 
     this.InitializeComponent(); 
     this.Loaded += BasicPage_Loaded; 
    } 

    private void BasicPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     Test1.Focus(FocusState.Programmatic); 
    } 

Test1 non riceve la messa a fuoco. Provo questo codice in un'applicazione Windows "normale" universale: è lavoro. Che cosa consigli?

risposta

6

È perché la funzione di messa a fuoco viene chiamata in un'altra posizione dopo aver chiamato il Test1.Focus.

In AppShell.xaml.cs, è possibile trovare il seguente codice:

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(); 
} 

Il codice di cui sopra significa che quando si accede a una pagina, sottoscriverà la pagina caricata evento e impostare la messa a fuoco a pagina.

Il tuo codice sottoscrive l'evento caricato nella pagina stessa. E il tuo codice verrà eseguito prima della funzione Page_Loaded in AppShell. Quindi non hai ottenuto quello che vuoi.

Quindi se si commenta semplicemente ((Page)sender).Focus(FocusState.Programmatic); nella funzione Page_Loaded. Otterrai quello che vuoi. Non sono sicuro di quale sia lo scopo esatto di quella linea. Ma tutto sembra buono.

Se trovi qualcosa di sbagliato dopo aver commentato quella riga, possiamo anche lavorarci sopra. Chiama la funzione di messa a fuoco una volta nell'evento LayoutUpdated dopo l'evento caricato.

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; 
    } 
} 

Spero che questo possa aiutarti.

+0

Grazie. Funziona con BasicPage_LayoutUpdated. – FetFrumos

0

se si desidera mettere a fuoco una casella di testo in modo programmatico. Previene la visualizzazione della tastiera in modo che l'evento layoutupdate non si attivi. Puoi fare qualcosa come quindi nell'evento page_loaded fai Test1.Focus (FocusState.Programmatic);

Problemi correlati