2011-12-22 14 views
9

Desidero aggiungere una barra dell'applicazione a più pagine della mia app. Quindi, sto definendo la barra dell'applicazione come una risorsa applicativa in modo che possa essere utilizzata da più pagine. Ora, i gestori di eventi per questi pulsanti sono nella classe App come indicato qui http://msdn.microsoft.com/en-us/library/hh394043%28v=VS.92%29.aspx. Ma questi pulsanti della barra delle applicazioni sono fondamentalmente scorciatoie per pagine importanti. Quindi, facendo clic su un pulsante verrai indirizzato alla pagina corrispondente. Ma, dal momento che sto definendo i gestori di eventi in App.xaml.cs, non mi consente di navigare. Capisco la ragione di questo. Ma, non so come risolvere il problema.Navigazione da App.xaml.cs

NavigationService.Navigate(new Uri("/Counting.xaml", UriKind.RelativeOrAbsolute)); 

dice "è necessario un riferimento a un oggetto per il campo non statico, metodo o proprietà System.Windows.Navigation.NavigationService.Navigate (System.Uri)"

risposta

24

funziona se si ottiene l'accesso al telaio?

(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Counting.xaml", UriKind.RelativeOrAbsolute)); 

Edit: Ogni applicazione ha un solo Frame. È questo frame che espone lo NavigationService. Pertanto, NavigationService è sempre accessibile tramite il frame in quanto è sempre presente un'istanza in qualsiasi app di Windows Phone. Dal momento che di solito non instanzia un nuovo NavigationService, è facile pensare che si tratti di un metodo statico. Tuttavia, in realtà è una classe non statica che viene istanziata automaticamente quando viene eseguita l'app. Tutto quello che stai facendo in questo caso è ottenere l'istanza globale, che è collegata al Frame sempre presente, e usarla per navigare tra le pagine. Ciò significa che la tua classe non deve istanziare, o ereditare esplicitamente, un NavigationService.

+0

Grazie mille. Ha funzionato. Potresti spiegarlo un po '? – Divya

+2

Prego. Ho modificato il mio post - spero che spieghi perché funziona. – keyboardP

0

un altro modo per navigare verso un'altra pagina da App.xaml.cs (usando la barra app) utilizza il rootFrame var (alla linea di fondo):

private Frame rootFrame = null; 
protected override async void OnLaunched(LaunchActivatedEventArgs args) 
{ 
    ... 
    SettingsPane.GetForCurrentView().CommandsRequested += App_CommandRequested; 
} 

private void App_CommandRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args) 
{ 
SettingsCommand cmdSnir = new SettingsCommand("cmd_snir", "Snir's Page", 
       new Windows.UI.Popups.UICommandInvokedHandler(onSettingsCommand_Clicked)); 
args.Request.ApplicationCommands.Add(cmdSnir); 
} 

void onSettingsCommand_Clicked(Windows.UI.Popups.IUICommand command) 
{ 
if (command.Id.ToString() == "cmd_snir") 
     rootFrame.Navigate(typeof(MainPage)); //, UriKind.RelativeOrAbsolute); 

} 
0

ho trovato un meglio questo approccio uno. L'oggetto RootFrame è già nel file App.xaml.cs, devi solo chiamarlo. Anche mettere questo in un dispatcher di thread dell'interfaccia utente è più sicuro.

Deployment.Current.Dispatcher.BeginInvoke(() => 
       { 
        // change UI here 
        RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative)); 
       }); 
+0

Perché è più sicuro? – GBU

Problemi correlati