zoukankan      html  css  js  c++  java
  • <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         }
    由于他的重要性,微软在开头提醒我们不要添加任何其他代码,以免导致程序无法启动。但是我们为了达到目的,只能选择无视之╮(╯-╰)╭
    示意图:

    在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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Ubuntu 出现apt-get: Package has no installation candidate问题
    关于Linux下如何获取计算机的硬件信息
    分享自fissure 《Linux编程 报错 找不到 term.h和curses.h》
    亚稳态-竺清儿-ChinaUnix博客
    分享自yebai445791253 《Verilog $random用法》
    CodeForces 1288D. Minimax Problem (二分+位运算)
    CodeForces 705D. Ant Man 贪心+链表
    CodeForces 832D. Misha, Grisha and Underground LCA
    CodeForces 832C. Strange Radiation 二分
    CodeForces 1102F. Elongated Matrix 状压Dp
  • 原文地址:https://www.cnblogs.com/aureate-sunshine/p/4148557.html
Copyright © 2011-2022 走看看