2013-04-15 63 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天。

*“一切都免费恢复”并不一定意味着当应用程序退出暂停状态时您没有任何工作要做。可能存在需要刷新的过时数据,并且可能需要刷新/重新创建连接或其他瞬态或短暂实体。