很多时候我们需要在启动程序的时候根据状态改变初始导航页面,比如程序在启动的时候判断用户是否登录,
如果未登录则跳转到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 }
由于他的重要性,微软在开头提醒我们不要添加任何其他代码,以免导致程序无法启动。但是我们为了达到目的,只能选择无视之╮(╯-╰)╭
示意图:
在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。
然后就大功告成啦。o(^▽^)o
作者:阳光是金色的
出处:http://www.cnblogs.com/aureate-sunshine/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。