2013-04-15 61 views
1

我是WinRT的新手,並且正在使用會話狀態。我正在導航到一個頁面來收集數據,然後想要返回到主頁面。就在導航之前,我使用:WinRT在頁面導航之間存儲會話狀態

SuspensionManager.SessionState["CurrentState"] = someObject; 

對象包含其他輕度複雜的對象,等名單......一切似乎是工作,但是這是使用懸掛經理的正確方法是什麼?

我已經看了看題目其他職位,有些人報告說,有必要使用[DataContract]和[DataMember]標註屬性,所有序列化的類。我忽略了它們,它仍然有效,(跨頁面獲取數據)。那麼推薦的方法是什麼?

+0

會話狀態需要可序列化。在應用程序設置會話狀態後調試應用程序時,使用命令「掛起和關閉」嘗試應用暫停和關閉流程。它可能會在SuspensionManager.save方法中引發異常。所以,使用datacontract屬性來使你的sessionstate對象(someObject)是正確的。 – Sushil

回答

1

我可能讀了太多成一個方面的問題,而是SuspensionManagerSessionState作用是隻存儲足夠的信息,使您的應用程序給用戶離開它的地方,如果應用被實際終止,而它已被暫停。

Windows 8 application lifecycle,您的應用程序被「暫停」,如果另一個應用程序來到前臺。當您的應用程序被暫停時,其所有狀態都會保留在內存中,並且如果重新激活(您翻轉回來),則所有內容都將「免費」恢復。

然而,暫停的應用程序也可能被操作系統終止(例如內存壓力的B/c),並且您的應用程序沒有機會對該場景做出反應,所以您真的在做什麼SessionState正在存儲需要什麼'重新創建'用戶在應用程序實際終止時的最後一個地方。這基本上是一項保險政策:如果申請僅僅是暫停,SessionState並不是真的需要。

的「什麼是必要的」是灰色地帶,我店所有關於信息說,正在進行或者我可以只保存用戶ID用戶配置文件索引到我所有的用戶配置文件的持久性存儲數據。我通常有更多的極簡主義的看法,並將保留儘可能少的SessionState - 我做了比喻,我不需要記住所有事情,我只需要記住如何/在哪裏得到/找到一切。

在您的問題中,您使用SessionState在您的應用中的頁面之間傳遞信息也有含義,這並不是真正的意圖。您的應用的每個頁面通常都與視圖模型相關聯,當您與該應用的某個頁面進行交互時,您將更新視圖模型並從視圖模型中已有的更改驅動其他屏幕和體驗。留下應用程序的一個屏幕並返回主應用程序也意味着您已經保存了您收集的任何信息 - 當然還有視圖模型,但也包含數據庫或本地存儲等持久性信息。當您重新訪問該頁面時,您會將數據從視圖模型(或持久性存儲)中取出。主頁不需要這些信息,所以爲什麼要堅持下去呢?

最後,因爲你提到是新的WinRT,你可能想看看App Builder,從而牽引到一起的許多資源,消費品塊通過了爲期30天的建設應用,帶領你(雖然所有材料是可用的,所以你可以消費任何你想要的速度:))與你的問題密切相關的生命週期管理的討論出現在該序列的第17天。

*「一切都免費恢復」並不一定意味着當應用程序退出暫停狀態時您沒有任何工作要做。可能存在需要刷新的過時數據,並且可能需要刷新/重新創建連接或其他瞬態或短暫實體。