动态修改启动时领航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)

<WP8开发学习笔记>动态修改启动时导航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)

 

很多时候我们需要在启动程序的时候根据状态改变初始导航页面,比如程序在启动的时候判断用户是否登录,

如果未登录则跳转到LoginPage.xaml否则跳转到MainPage界面。

这时候就要分析程序的启动和导航的过程。

程序的启动是App.xamlcs负责的。

App类的构造器,里面就是一个App的初始化流程

 1 public App()
 2         {
 3             // 未捕获的异常的全局处理程序。
 4             UnhandledException += Application_UnhandledException;
 5 
 6             // 标准 XAML 初始化
 7             InitializeComponent();
 8 
 9             // 特定于电话的初始化
10             InitializePhoneApplication();
11 
12             // 语言显示初始化
13             InitializeLanguage();
14 
15             // 调试时显示图形分析信息。
16             if (Debugger.IsAttached)
17             {
18                 // 显示当前帧速率计数器。
19                 Application.Current.Host.Settings.EnableFrameRateCounter = true;
20 
21                 // 显示在每个帧中重绘的应用程序区域。
22                 //Application.Current.Host.Settings.EnableRedrawRegions = true;
23 
24                 // 启用非生产分析可视化模式,
25                 // 该模式显示递交给 GPU 的包含彩色重叠区的页面区域。
26                 //Application.Current.Host.Settings.EnableCacheVisualization = true;
27 
28                 // 通过禁用以下对象阻止在调试过程中关闭屏幕
29                 // 应用程序的空闲检测。
30                 //  注意: 仅在调试模式下使用此设置。禁用用户空闲检测的应用程序在用户不使用电话时将继续运行
31                 // 并且消耗电池电量。
32                 PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
33             }
34 
35         }

 其中的InitializePhoneApplication() 就有页面导航的相关处理

 1  // 请勿向此方法中添加任何其他代码
 2         private void InitializePhoneApplication()
 3         {
 4             if (phoneApplicationInitialized)
 5                 return;
 6 
 7             // 创建框架但先不将它设置为 RootVisual;这允许初始
 8             // 屏幕保持活动状态,直到准备呈现应用程序时。
 9             RootFrame = new PhoneApplicationFrame();
10             RootFrame.Navigated += CompleteInitializePhoneApplication;
11 
12             // 处理导航故障
13             RootFrame.NavigationFailed += RootFrame_NavigationFailed;
14 
15             // 在下一次导航中处理清除 BackStack 的重置请求,
16             RootFrame.Navigated += CheckForResetNavigation;
17 
18             // 确保我们未再次初始化
19             phoneApplicationInitialized = true;
20         }
由于他的重要性,微软在开头提醒我们不要添加任何其他代码,以免导致程序无法启动。但是我们为了达到目的,只能选择无视之╮(╯-╰)╭
示意图:
<WP8开发学习笔记>动态修改启动时领航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)
在InitializePhoneApplication()里面加入RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);
给navigating事件添加自己写的Handler

NavigatingCancelEventHandler:
 1 void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
 2         {
 3             if (e.Uri.ToString().Contains("LoginPage.xaml") && isLogined())
        //这里一定要有判断条件,因为RootFrame在任何页面进行Navigate的时候都会掉用Navigating,或者采用跟RootFrame.Navigated 方式一样的递归方法 4 { 5 e.Cancel = true;//取消事件 6 string uriString = "/MainPage.xaml"; 7 Uri ur = new Uri(uriString, UriKind.Relative); 8 App.RootFrame.Dispatcher.BeginInvoke(delegate 9 { 10 App.RootFrame.Navigate(ur); 11 }); 12 } 13 }
最后一点,就是修改WMAppManifest.xml中默认的导航页,把他改成LoginPage.xaml。

<WP8开发学习笔记>动态修改启动时领航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)


然后就大功告成啦。o(^▽^)o


作者:阳光是金色的
出处:http://www.cnblogs.com/aureate-sunshine/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

4楼陌上青青草
可以不动InitializePhoneApplication,把相关的逻辑放到LoginPage.xaml.cs中的override void OnNavigatedTo
Re: 阳光是金色的
@陌上青青草,这样会quot;真的quot;导航到LoginPage,LoginPage会出现一会儿,闪一下然后跳转到MainPage.
3楼Walsh
不是 写个 UriMapper 么 -,-
2楼yonghu86
哥们,多上图,你这文章没有可读性。等于白写!
Re: 阳光是金色的
@yonghu86,好吧。我弄些图片上去。
1楼h82258652
都8.1了,别折腾8.0啦