Navigating from App.xaml.cs
本文关键字:cs xaml App from Navigating | 更新日期: 2023-09-27 18:18:32
我想添加一个应用程序栏到我的应用程序的多个页面。所以,我定义应用程序栏作为一个应用程序资源,以便它可以被多个页面使用。现在,这些按钮的事件处理程序位于这里提到的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)"
如果您访问框架,它是否工作?
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Counting.xaml", UriKind.RelativeOrAbsolute));
编辑:每个应用程序只有一个Frame。正是这个框架暴露了NavigationService
。因此,NavigationService总是可以通过框架访问,因为它在任何Windows Phone应用程序中总是有一个实例。因为你通常不实例化一个新的NavigationService
,很容易认为它是一个静态方法。然而,它实际上是一个非静态类,在应用程序运行时自动实例化。在这种情况下,您所做的就是获取全局实例,它附加到始终存在的Frame上,并使用它在页面之间导航。这意味着你的类不必实例化或显式继承NavigationService。
从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);
}
我发现这种方法更好。RootFrame对象已经在App.xaml.cs文件中,您只需要调用它。而且,把它放在UI线程调度程序中更安全。
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
// change UI here
RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
});