標籤:內容 rri 產生 arguments current content 如何 就會 還原
所謂開機前,其實你一看那名字就知道是啥意思了,這是直接譯,也找不到比這個叫法更簡練的詞了。在系統資源允許的情況下(比如電池電量充足,有足夠的記憶體空間),系統會把使用者常用的應用程式在後台啟動,但不會顯示使用者介面。在開機前時,可以事先初始化一些資料,等到使用者正式啟動應用時,呈現介面的效率就有所提升。
開機前的時候,應用程式仍然會調用 OnLaunched 方法的,在 OnLaunched 方法調用之後,會馬上發生 Suspending 事件,隨後應用就會暫停。
當使用者正式啟動應用時,同樣也會調用 OnLaunched 方法,那麼,如何知道應用程式是正式啟動還是開機前呢。OnLaunched 方法的參數有一個 PrelaunchActivated 屬性,布爾類型,如果這個屬性為真,說明當前調用是開機前;否則就是正式啟動。因此,在處理 OnLaunched 方法時,只要判斷這個屬性就可以了,當它為false時,才去建立使用者介面。
應用項目預設產生的模板代碼是這樣的:
protected override void OnLaunched(LaunchActivatedEventArgs e) { Frame rootFrame = Window.Current.Content as Frame; // 不要在視窗已包含內容時重複應用程式初始化, // 只需確保視窗處於活動狀態 if (rootFrame == null) { // 建立要充當導航內容相關的架構,並導航到第一頁 rootFrame = new Frame(); rootFrame.NavigationFailed += OnNavigationFailed; // 將架構放在當前視窗中 Window.Current.Content = rootFrame; } if (e.PrelaunchActivated == false) { if (rootFrame.Content == null) { // 當導航堆棧尚未還原時,導航到第一頁, // 並通過將所需資訊作為導航參數傳入來配置 // 參數 rootFrame.Navigate(typeof(MainPage), e.Arguments); } // 確保當前視窗處於活動狀態 Window.Current.Activate(); } }
它是先執行個體化作為UI根的 Frame 對象,然後再判斷它是否為開機前,如果不是,就導航到首頁面。
我們可以乾脆這樣修改:
protected override void OnLaunched(LaunchActivatedEventArgs e) { if (!e.PrelaunchActivated) { Frame rootVisual = Window.Current.Content as Frame; if (rootVisual == null) { rootVisual = new Frame(); Window.Current.Content = rootVisual; } if (rootVisual.Content == null) { rootVisual.Navigate(typeof(MainPage), e.Arguments); } Window.Current.Activate(); } }
反正不建立UI了,弄個 Frame 在那裡也沒什麼毛用,不如直接等到正式啟動時再建立 Frame 。
OK,現在大伙兒都知道怎麼判斷開機前了,那麼,我如果要調試開機前,該做啥。要對開機前進行調試,不要直接運行調試,因為直接運行是進入正式啟動方式,而不是開機前。
正確的操作是:依次執行菜單【調試】-【調試其他目標】-【調試通用 Windows 應用開機前】,然後就會執行 OnLaunched 方法,而 PrelaunchActivated 屬性就能返回 true。
在調試的時候,應用不會引發 Suspending 事件,你可以通過【調試位置】工具列控制應用進入 Suspend 狀態。
好了,本文內容實在太簡單了,為了節約時間,此處省略 310 個字…… 本文結束。
【Win 10 應用開發】應用開機前