?
很多時候我們需要在啟動程序的時候根據狀態改變初始導航頁面,比如程序在啟動的時候判斷用戶是否登錄,
如果未登錄則跳轉到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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。