2014/12/16

[筆記] Windows Store App 使用 SuspensionManager 無法儲存頁面狀態的問題

其實在開發 Store App 時如果新增的頁面是 BasicPage.xaml 以上的頁面,就會自動在方案下面開一個 common 目錄,並放一些預設的 Helper 來協助快速開發 App, 其中 SuspensionManager.cs 就是用來提供儲存狀態的 Helper Class



然後按照: Saving and Restoring State in a Windows 8 XAML App 提供的操作方式


1.在 App 的 OnLaunched 加入
 SuspensionManager.RegisterFrame(rootFrame, "AppFrame");

2.在 App 的 OnSuspending 加入
 await SuspensionManager.SaveAsync();
記得 OnSuspending  要 async 

3.在 App 中的 OnLaunched 判斷
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
{
 await SuspensionManager.RestoreAsync();
}


就可以實作出暫停/回復狀態的 App 了



但不知道為毛我做下去之後都會失敗,實際去追 SuspensionManager 的 code 發現



錯誤的位置是

private static void SaveFrameNavigationState(Frame frame)
{
 var frameState = SessionStateForFrame(frame);
 frameState["Navigation"] = frame.GetNavigationState();
}


的 frame.GetNavigationState();

錯誤訊息是說這個東西不能序列化 Frame.Navigate 丟過來的參數 (看了半天才弄懂,英文大退化還是沒睡飽啊我 0rz 0rz 0rz)

Frame.Navigate(TypeName, Object) method

寫到這邊又發現....

上面的超連結下面的詳細說明,是有說明 Object 有限制那些項目的

Parameters

sourcePageType
Type: System.Type [.NET] | TypeName [C++]
The page to navigate to, specified as a type reference to its partial class type. (A type reference is given asSystem.Type for .NET, or a TypeName helper struct for C++/CX).
parameter
Type: System.Object [.NET] | Platform::Object [C++]
The navigation parameter to pass to the target page; must have a basic type (string, char, numeric, or GUID) to support parameter serialization using GetNavigationState.


但我傳進去的東西,是一個在專案裡面自訂的物件,無法支援序列化,所以在存的時候就炸了 0rz

知道是這個問題,就好解了,把物件用 Json.Net 序列化成字串再丟進去,進到目標頁面之後再轉回原本的物件型態即可~~!

打完收工 = =

為了剛開始急著要寫出所有功能,還沒完全做好功課就開始亂寫一通

結果昨天還了一整天的債 0rz


沒有留言:

張貼留言