2012-12-11 10 views
11

Quando viene caricata la pagina UserLogin, voglio controllare il database utente e, se non esiste, o non può essere letto, voglio indirizzarlo a NewUser pagina.Non è possibile navigare verso le pagine su Windows Metro App utilizzando C#

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    CheckForUser(); 
    if (UserExists == false) 
     this.Frame.Navigate(typeof(NewUser)); 
} 

Il problema è che non naviga verso NewUser, anche quando io commento la condizione if.

+2

hanno di controllare MSDN ** Questo è il link http://msdn.microsoft.com/en-us/library/windows/apps/br211386.aspx ** – MethodMan

+0

non pensavo che si potesse navigare nel Metodo 'OnNavigatedTo' perché sei ancora nel mezzo di una navigazione. – Trisped

risposta

14

Navigate non può essere chiamato direttamente da OnNavigatedTo metodo. Si dovrebbe richiamare il codice attraverso Dispatcher e funzionerà:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 
    CheckForUser(); 
    if (UserExists == false) 
     Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
          () => this.Frame.Navigate(typeof(NewUser))); 
} 
+0

Assicuratevi di chiamare base.OnNavigatedTo (e) nella parte superiore della chiamata al metodo sopraindicato. Ho avuto questo stesso codice, meno la base.OnNavigatedTo (e) e stavo ancora ottenendo un'eccezione. Questa risposta mi ha aiutato, grazie! –

0

si può provare questo e vedere se questo funziona

frame.Navigate(typeof(myPage)); // the name of your page replace with myPage 

esempio completo

var cntnt = Window.Current.Content; 
    var frame = cntnt as Frame; 

    if (frame != null) 
    { 
     frame.Navigate(typeof(myPage)); 
    } 
    Window.Current.Activate(); 

o

se si desidera utilizzare uno strumento 3rd party come Telerik provare questo link come pure

Classic Windows Forms, Stunning User Interface

0

Vedo che si esegue l'override del metodo OnNavigatedTo ma non si chiama il metodo base. Potrebbe essere la fonte del problema. Prova chiamando il metodo di base prima di qualsiasi logica:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    base.OnNavigatedTo(e); 
    CheckForUser(); 
    if (UserExists == false) 
     this.Frame.Navigate(typeof(NewUser)); 
} 
0

Usa Dispatcher.RunIdleAsync di posticipare la navigazione a un'altra pagina fino a quando la pagina UserLogin è completamente caricato.

0

Gli altri sono corrette, ma dal momento che Dispatcher non funziona dal modello vista, ecco come fare lì:

SynchronizationContext.Current.Post((o) => 
{ 
    // navigate here 
}, null); 
1

Questo accade perché la vostra applicazione cerca di spostarsi prima che il frame corrente completamente caricato. Dispatcher potrebbe essere una buona soluzione, ma devi seguire la seguente sintassi.

utilizzando Windows.UI.Core;

private async void to_navigate() 
    { 
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => this.Frame.Navigate(typeof(MainPage))); 
    } 
  1. Sostituire MainPage con il tuo nome pagina desiderata.
  2. Chiamare questa funzione to_navigate().
Problemi correlati