2011-12-22 17 views
9

Chcę dodać pasek aplikacji do wielu stron mojej aplikacji. Tak więc definiuję pasek aplikacji jako zasób aplikacji, aby mógł być używany przez wiele stron. Teraz moduły obsługi zdarzeń dla tych przycisków znajdują się w klasie App, jak wspomniano tutaj: http://msdn.microsoft.com/en-us/library/hh394043%28v=VS.92%29.aspx. Ale te przyciski paska aplikacji to w zasadzie skróty do ważnych stron. Kliknięcie przycisku spowoduje przejście do odpowiedniej strony. Ale ponieważ definiuję funkcje obsługi zdarzeń w App.xaml.cs, nie pozwala mi to na nawigację. Rozumiem powód tego. Ale nie wiem, jak rozwiązać problem.Nawigacja z App.xaml.cs

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

mówi „Odwołanie do obiektu jest wymagane dla non-statycznego pola, metody lub właściwości System.Windows.Navigation.NavigationService.Navigate (System.Uri)”

Odpowiedz

24

to działa, jeśli uzyska dostęp do ramy?

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

Edit: Każda aplikacja ma tylko jeden Frame. Ta ramka eksponuje NavigationService. Dlatego usługa nawigacyjna jest zawsze dostępna za pośrednictwem ramki, ponieważ zawsze istnieje jej instancja w dowolnej aplikacji Windows Phone. Ponieważ zazwyczaj nie tworzy się nowego NavigationService, łatwo jest myśleć, że jest to metoda statyczna. Jest to jednak klasa niestatyczna, która automatycznie tworzy instancję po uruchomieniu aplikacji. Wszystko, co robisz w tym przypadku, polega na uzyskaniu globalnej instancji, która jest dołączona do zawsze istniejącej klatki i używa jej do nawigowania między stronami. Oznacza to, że twoja klasa nie musi tworzyć instancji lub jawnie dziedziczyć usługi nawigacji.

+0

Wielkie dzięki. Zadziałało. Czy mógłbyś wyjaśnić to trochę? – Divya

+2

Nie ma za co. Redagowałem swój post - mam nadzieję, że wyjaśnia on, dlaczego to działa. – keyboardP

0

Innym sposobem, aby przejść do innej strony z App.xaml.cs (za pomocą paska aplikacji) używa rootFrame var (przy linii końcowej):

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

znalazłem to podejście lepiej jeden. Obiekt RootFrame znajduje się już w pliku App.xaml.cs, wystarczy go wywołać. Również umieszczenie tego w dispatcherze wątków UI jest bezpieczniejsze.

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

Dlaczego jest bezpieczniej? – GBU

Powiązane problemy