【问题标题】:Saving page state in a 3 page app in WP7在 WP7 的 3 页应用程序中保存页面状态
【发布时间】:2011-10-20 11:12:25
【问题描述】:

这是我的第一个问题,据我搜索,我没有找到解决问题的方法。我正在为 WP7 编写我的第一个 rssreader 应用程序,但我遇到了页面状态问题。我有 3 页,导航是这样的 主页 >>> 列表项页面 >>> 详细信息页面。 Mainpage 是一个数据绑定模型,带有预配置的 feed 类别项目(url 和名称),listitempage 是一个页面,我在其中实现了一个 web 客户端来读取 feed 项目,而 detailspage 是我从 listitempage 传递所选 feed 项目的详细信息的地方。在这些情况下工作的页面状态:

mainpage >>> start button >>> back button (OK)<br/>
listitempage >>> start button >>> back button (Doesn't work)<br/>
detailspage >>> start button >>> back button (OK)<br/>

在详细信息页面中,我使用 OnNavigatedTo/From 和 State.TryGetValue 保存页面状态 这似乎可行,但如果我创建一个带有浏览器任务的按钮,以便用户可以在浏览器打开并且用户按下后退按钮时导航到完整文章,详细信息页面状态有效。如果用户第二次按下后退按钮,则应用程序将退出,而不是导航回 listitempage。所以我也有这个问题:

detailspage >>> browserbuttontask >>> backbutton >>> restorepage >>> backbutton->exit<br/>

有什么想法吗?

【问题讨论】:

    标签: c# silverlight windows-phone-7 page-lifecycle


    【解决方案1】:

    我建议在由 Matt Lacey(Windows Phone 用户组)编写的 codeplex 上使用 Tombstone 助手。

    http://tombstonehelper.codeplex.com/

    它可以非常轻松地解决您的所有问题,或者至少向您展示如何将页面状态写入隔离存储以供长期使用(请记住,状态缓存仅在设备通电时才存在,只要手机不需要清空内存)

    希望这会有所帮助 Rgds 西蒙

    【讨论】:

    • 感谢暗面的回复。我已经使用了它,但没有任何结果。不幸的是,Tombstone Helper 甚至没有正确保存详细信息页面状态。我用于保存详细信息页面的当前页面状态的方法运行良好(除了浏览器任务的问题),但我也想要 listitemspage 类似的东西,但我已经没有想法了。我想用页面状态来做这件事,而不用弄乱隔离存储。如果可能的话。
    【解决方案2】:

    如果您想保存页面状态而不弄乱独立存储,请尝试使用 SterlingDB。它使用独立存储,但设置和使用非常简单。您可以通过 nuget 添加英镑。您必须将想要保留的数据粘贴到类中,但保存和加载很简单。

    除此之外,您可能还想查看Caliburn Micro。它将页面生命周期添加到您的 ViewModel,例如 OnInitialize、OnActivate、OnDeactivate。它还为 WP7 添加了一些不错的东西,例如将 ViewModel 上的属性自动持久化到独立存储或手机状态。

    http://www.sterlingdatabase.com/

    【讨论】:

    • 感谢德里克的建议。尽管它们看起来对我来说实施起来太困难了(我还是个初学者)。现在让我们关注如何从 listitemspage 恢复数据。我试图在该页面上实现 OnNavigatedTo/From 和 State.TryGetValue 但我猜当 OnNavigateTo 被调用时,页面永远不会重新加载以运行 webclient 事件来获取项目。有没有办法做到这一点?
    • 因此,当您点击浏览器时,您的应用程序回栈将被擦除。它确实返回到您的详细信息页面的原因是因为它位于浏览器的后台堆栈中。那时你需要一些逻辑来确定你来自哪里以及它应该在另一个后退按钮上去哪里。查看buildmobile.com/windows-phone-7-navigation 了解如何订阅 OnBackKeyPress 事件。
    【解决方案3】:

    听起来您的应用程序在将状态恢复到列表页面时抛出异常,这具有终止应用程序的效果。

    您是否尝试过在附加调试器的情况下执行所有这些操作?它应该向您显示正在抛出什么异常以及在哪里抛出。

    【讨论】:

    • 我用新的芒果 SDK 更新了我的代码,现在状态处理工作正常。谢谢大家的回复!
    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多