作業筆記:現操week4

學號:15331334
姓名:徐楚燕
班級:教務4班
作業:實驗4

知識點-應用生命週期

msdn官方文檔
這裏寫圖片描述

應用啓動

當啓動應用時,會調用 OnLaunched 方法。 向該方法傳遞LaunchActivatedEventArgs參數
LaunchActivatedEventArgs.PreviousExecutionState 獲取應用之前的狀態,這將返回 ApplicationExecutionState對象

Suspending (應用暫停)

當用戶最小化某個應用時,Windows 會等待數秒,以查看用戶是否會切換回該應用。 如果用戶在此時間範圍內未切換回,並且任何擴展執行、後臺任務或活動贊助執行都未處於活動狀態,則 Windows 將暫停該應用。 只要應用中不存在任何處於活動狀態的擴展執行會話等,該應用也將在出現鎖屏界面時暫停。

當暫停應用時,它將調用 Application.Suspending 事件。 Visual Studio 的 UWP 項目模板爲在 App.xaml.cs 中稱爲 OnSuspending 的此事件提供處理程序。 在 Windows 10 版本 1607 之前,要在此處添加用於保存狀態的代碼。 現在建議在進入後臺狀態時保存狀態,如上所述。

應用終止

當你的應用暫停時,系統會嘗試將你的應用及其數據保留在內存中。 但是,如果系統沒有資源將你的應用保留在內存中,它將終止你的應用。 應用不會收到它們被終止的通知,所以你只能將應用數據保存在 OnSuspension 事件處理程序中,或者在 EnteredBackground 處理程序中以異步方式保存

當應用確定它在終止後被激活時,它應該加載它保存的應用程序數據,以使應用處於與其終止之前相同的狀態。 當用戶切換回已終止的暫停應用時,該應用應該在其 OnLaunched 方法中還原其應用程序數據。 當終止應用時系統不會通知應用,因此在暫停應用之前,你的應用必須保存其應用程序數據釋放獨佔資源和文件句柄,並且當在終止後又激活應用時還原這些內容

知識點-應用數據

https://docs.microsoft.com/zh-cn/windows/uwp/app-settings/store-and-retrieve-app-data

應用數據類型

應用數據有兩類:設置和文件。

設置

使用設置存儲用戶首選項和應用程序狀態信息。 應用數據 API 使你能夠輕鬆創建和檢索設置(我們將在本文的後面部分介紹一些示例)。

下面是可以用於應用設置的數據類型:

UInt8、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double
布爾值
Char16、String
DateTime、TimeSpan
GUID、Point、Size、Rect
ApplicationDataCompositeValue:一組必須按原子方式序列化和反序列化的相關應用設置。 使用複合設置可輕鬆處理相互依賴的設置的原子更新。 系統會在併發訪問和漫遊時確保複合設置的完整性。 複合設置針對少量數據進行了優化,如果將它們用於大型數據集,性能可能很差。

本地應用數據

本地應用數據應用於需要在應用會話之間予以保留但不適合於漫遊應用數據的任何信息。

檢索本地應用數據存儲

在讀取或編寫本地應用數據前,必須檢索本地應用數據存儲。 若要檢索本地應用數據存儲,請使用 ApplicationData.LocalSettings 屬性獲取應用作爲 ApplicationDataContainer 對象的本地設置
使用 ApplicationData.LocalFolder 屬性可以獲取 StorageFolder 對象中的文件
使用ApplicationData.LocalCacheFolder 屬性來獲取保存不包括在備份和還原中的文件的本地應用數據存儲中的文件夾。

ApplicationDataContainer.Values類似於一個超大的對象,用鍵對存儲數據。

Windows.Storage.ApplicationDataContainer localSettings = 
    Windows.Storage.ApplicationData.Current.LocalSettings;
localSettings.Values["exampleSetting"] = "Hello Windows";

嵌套Object作爲數值:用 ApplicationDataCompositeValue對象。

標準檢索(也就是讀取數據):

// Composite setting

Windows.Storage.ApplicationDataCompositeValue composite = 
   (Windows.Storage.ApplicationDataCompositeValue)localSettings.Values["exampleCompositeSetting"];

if (composite == null) // 先檢查鍵值是否爲空
{
   // No data
}
else
{
   // Access data in composite["intVal"] and composite["strVal"]
}

實驗過程

基本需求

原文:

點擊checkbox出現橫線,掛起並關閉程序,重新啓動時,程序顯示在Mainpage界面,並且點擊的checkbox與對應橫線都存在。
在NewPage中,輸入數據,掛起並關閉程序,重新啓動時,程序顯示在 NewPage頁面,並且掛起前輸入的數據還在。

返回按鈕的實現

1.在頁面的OnNavigatedTo函數裏控制按鈕可視性

 SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
                    AppViewBackButtonVisibility.Visible;

2.在app.xaml.cs裏修改OnLanched函數註冊BackRequested

 Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested +=
    OnBackRequested;

3.在app.xaml.cs裏編寫OnBackRequested函數

private void OnBackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
        {
            if (BackRequested != null)
            {
                BackRequested(this, e);
            }
            if (!e.Handled)
            {
                Frame frame = Window.Current.Content as Frame;
                if (frame.CanGoBack)
                {
                    frame.GoBack();
                    e.Handled = true;
                }
            }
        }

CheckBox.IsChecked 和 Line.Visibility 綁定

居然找到一模一樣的問題,還是微軟社區官方解答,絲毫不用動腦
–答案就在這裏–

這次實驗終於解決了一個困擾我多時的問題:
有時新建類之後會各種找不到類名,感覺最安全的方法是從一開始就確定好類名,之後不要修改也不要改變命名空間。這樣是最安全的。
(好像也不是什麼有用的發現……)

是否使用Converter跟Windows系統的版本有關:

If your app is targeted to Windows 10 ver1607(10.0.14393) or later, your code is written in right syntax. The code “as is” would work properly as you expect, because boolean-to-visibility conversion is automatically fulfilled. See footer-note in Data binding overview.

But if your app is targeted to earlier versions (such as 10.0.10586-), you need to define a value-converter class which is to be used in binding for that conversion.

保存程序暫停前的狀態並恢復

記錄訪問頁面並在暫停後恢復時重新訪問。數據也保存。

保存頁面狀態

Frame.GetNavigationState()得到當前頁面狀態的string。並存入本地數據。
當應用啓動時,檢查鍵值,存在則導航至newPage。

One way is to use Frame.SetNavigationState. When you’re on page A, store Frame.GetNavigationState in a static variable which is accessible anywhere in the app.

MyClass.PageANavigationState = Frame.GetNavigationState();

When you’re on E (or whichever page), and you want to clear the navigation stack up to A, use

Frame.SetNavigationState[MyClass.PageANavigationState];

看了一下app.cs, 看起來其實已經處理好了

Onlaunched()
 if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    //TODO: 從之前掛起的應用程序加載狀態
                    if (ApplicationData.Current.LocalSettings.Values.ContainsKey("NavigationState"))
                    {
                        rootFrame.SetNavigationState((string)ApplicationData.Current.LocalSettings.Values["NavigationState"]);
                    }
                }
private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            //TODO: Save application state and stop any background activity
            // Set this flag - this happens before the page navigatedfrom
            IsSuspending = true;

            // Get the frame navigation state serialized as a string and save in settings
            Frame frame = Window.Current.Content as Frame;
            ApplicationData.Current.LocalSettings.Values["NavigationState"] = frame.GetNavigationState();
            deferral.Complete();
        }

執行,在NewPage的OnNavigatedFrom保存數據時居然出錯了:

protected override void OnNavigatedFrom(NavigationEventArgs e) // 從該頁面離開時
        {
            bool suspending = ((App)App.Current).IsSuspending;
            if (suspending)
            {
                // 保存數據
                var composite = new ApplicationDataCompositeValue(); //<====這一行出錯了
                composite["Title"] = Title.Text;
                composite["Details"] = Details.Text;
                composite["Date"] = DueDatePicker.Date;
                ApplicationData.Current.LocalSettings.Values["NewPage"] = composite;
            }
            // 保存頁面狀態
            ApplicationData.Current.LocalSettings.Values["NavigationState"] = Frame.GetNavigationState();
        }

———去掉

ApplicationData.Current.LocalSettings.Values["NavigationState"] = Frame.GetNavigationState();

即可。

存儲數據時,

 DueDatePicker.Date = (DateTimeOffset)composite["Date"];

Date項不需先轉換成string再轉換成DateTimeOffset類。

另外也要像上一次那樣在Mainpage的構造函數加上

 NavigationCacheMode = NavigationCacheMode.Enabled;

來保存緩存狀態。

運行截圖

這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章