动态修改启动时导航的第一个页面(如登录前启动页为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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

你可能感兴趣的:(login)