从App.xaml.cs导航

9
我想在我的应用程序的多个页面上添加应用程序栏。因此,我将应用程序栏定义为应用程序资源,以便它可以被多个页面使用。现在,这些按钮的事件处理程序在App类中,如此处所述http://msdn.microsoft.com/en-us/library/hh394043%28v=VS.92%29.aspx。但是,这些应用程序栏按钮基本上是到重要页面的快捷方式。因此,单击按钮只会带您转到相应的页面。但是,由于我在App.xaml.cs中定义了事件处理程序,它不允许我导航。我理解这个问题的原因。但是,我不知道如何解决这个问题。
NavigationService.Navigate(new Uri("/Counting.xaml", UriKind.RelativeOrAbsolute));

提示"需要对象引用,以访问非静态字段、方法或属性System.Windows.Navigation.NavigationService.Navigate(System.Uri)"

3个回答

24

如果您能够访问该框架,它是否有效?

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

编辑: 每个应用程序仅有一个框架。正是这个框架公开了NavigationService。因此,由于在任何Windows Phone应用程序中都存在它的实例,所以可以始终通过该框架访问NavigationService。由于通常不会实例化新的NavigationService,因此很容易认为它是一个静态方法。但是,它实际上是一个非静态类,在运行应用程序时自动实例化。在这种情况下,你所做的只是获取全局实例,该实例附加到始终存在的Frame上,并使用它在页面之间导航。这意味着你的类不必实例化或显式继承NavigationService。


非常感谢,它起作用了。你能否请解释一下这个? - Divya
2
不用谢。我已经编辑了我的帖子 - 希望它能解释为什么它有效。 - keyboardP

0

我发现这种方法更好。RootFrame对象已经在App.xaml.cs文件中,您只需要调用它即可。同时将其放在UI线程调度程序中更加安全。

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

0

从App.xaml.cs导航到另一个页面的另一种方法(使用应用栏)是使用rootFrame变量(在最后一行):

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接