2011-12-22 9 views
9

私のアプリケーションの複数のページにアプリケーションバーを追加したいと思います。ですから、アプリケーション・バーを複数のページで使用できるようにアプリケーション・リソースとして定義しています。これらのボタンのイベントハンドラは、ここではhttp://msdn.microsoft.com/en-us/library/hh394043%28v=VS.92%29.aspxのようにAppクラスにあります。 しかし、これらのアプリケーションバーボタンは基本的に重要なページへのショートカットです。したがって、ボタンをクリックするだけで、対応するページに移動します。しかし、私はApp.xaml.csにイベントハンドラを定義しているので、移動することはできません。私はこの理由を理解しています。しかし、私はどのように問題を解決するのか分かりません。App.xaml.csからのナビ

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

は、「オブジェクト参照が非静的フィールド、メソッドまたはプロパティSystem.Windows.Navigation.NavigationService.Navigate(可能System.Uri)のために必要である」あなたがアクセス権を取得する場合

答えて

24

それが動作しますと言いますフレームに?

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

編集: 各アプリケーションは、唯一のFrameています。これはNavigationServiceを公開するフレームです。したがって、NavigationServiceは常にフレーム経由でアクセス可能です。これは、Windows Phoneアプリケーションに常にインスタンスが存在するためです。通常、新しいNavigationServiceをインスタンス化しないので、静的メソッドだと考えるのは簡単です。しかし、実際には、アプリの実行時に自動的にインスタンス化される非静的クラスです。この場合、常に存在するフレームにアタッチされたグローバルインスタンスを取得し、それを使用してページ間を移動します。つまり、クラスがNavigationServiceをインスタンス化する必要はなく、明示的に継承する必要もありません。

+0

ありがとうございます。出来た。少し説明していただけますか? – Divya

+2

あなたは大歓迎です。私は自分の投稿を編集しました。 – keyboardP

0

(エンドラインで)rootFrameのVARを使用している(アプリバーを使用して)App.xaml.csから他のページに移動する他の方法:

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

私はより良い、このアプローチを見つけました1。 RootFrameオブジェクトは既にApp.xaml.csファイルにあり、呼び出すだけです。また、これをUIスレッドディスパッチャに配置する方が安全です。

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

なぜより安全ですか? – GBU