C# WP7从墓碑中恢复并返回第页

C# WP7从墓碑中恢复并返回第页,c#,windows-phone-7,mvvm,mvvm-light,C#,Windows Phone 7,Mvvm,Mvvm Light,当用户从墓碑中恢复时,是否有一种好的/优雅的方式返回到用户所在的页面?我不确定我的应用程序或它是否只是工作方式,但我总是回到主页上 我的应用程序是用一个带有透视控件的主页设置的,几个透视项将导航到新页面。如果有意义的话,我的名字看起来是这样的: PivotItem1->PageA 数据透视项2->PageB->PageC PivotItem3->PageD->PageE-PageF(按PageF上的后退按钮将使用非线性导航服务返回主页) 因此,如果任何页面上的用户墓碑,我想将它们返回到该页面,并

当用户从墓碑中恢复时,是否有一种好的/优雅的方式返回到用户所在的页面?我不确定我的应用程序或它是否只是工作方式,但我总是回到主页上

我的应用程序是用一个带有透视控件的主页设置的,几个透视项将导航到新页面。如果有意义的话,我的名字看起来是这样的:

PivotItem1->PageA
数据透视项2->PageB->PageC
PivotItem3->PageD->PageE-PageF(按PageF上的后退按钮将使用非线性导航服务返回主页)

因此,如果任何页面上的用户墓碑,我想将它们返回到该页面,并提供backbackback,这样导航就不会出错


我正在使用MVVM轻型和非线性导航服务,如果这有助于或有损于我试图实现的目标。

我有一个类似的导航应用程序,它可以满足您的需要(也使用非线性导航服务)。在我的例子中,我将用户的当前页面/数据透视项存储在独立的存储中,并附带一个令牌(或bool),指示应用程序是否从墓碑中返回。当用户导航到某个页面时,页面加载会在iso中设置当前页面值,如果该页面有一个轴,它还会将当前轴设置为第一个轴。pivot_changed事件包含将新的当前pivot更改为用户刚刚更改的pivot的代码

当应用程序处于逻辑删除过程中时,会触发app_deactivate事件,我就是在这里将iso中的IsTombstoned值设置为true

当用户从墓碑记录中返回时,主页加载首先检查应用程序是否正在从墓碑记录中重新激活(IsTombstoned=true),如果是,它将立即导航到名称存储在iso中的页面。当当前页面加载触发时,它会检查IsTombstoned=true,如果是,则将其设置为false(返回正常),如果页面上有轴,则将所选轴项目设置为存储的当前轴。如果页面没有透视控件,则当前透视将留空。如果在页面被删除时页面中存在动态内容,则还需要为其恢复提供支持


很抱歉,我没有向您展示代码,但我不在工作站,无法访问它。

@Tyler,网络药剂师:很抱歉,我不能直接在您的讨论中“添加评论”。我的名声还是太差了。我也没有任何博客可以把它贴在那里,并给你一个链接。我就写在这里,因为我认为它值得注意和写在某个地方,所以其他人也可以检查/使用/永久性从中获益

…所以,请原谅我在这里写这篇“离题文章”:

虽然我不知道如何很好地解决这个问题——我的解决方案通常是手工收集导航历史堆栈,将其放入iso,然后在激活时恢复并跳到正确/最后的位置——但我可以告诉您一些关于墓碑的信息

问题是,如果您的应用程序被停用,这并不意味着它将被删除。停用仅仅意味着您的应用程序被调出屏幕。在Mango版本中,您可以点击并按住“后退”设备按钮,查看当前打开的应用程序,然后跳转到任意位置。“激活”是指应用程序被唤醒时。即使在WP7 SDK+Emulator的早期版本中,我也在从应用程序调用外部mediaplayer,而我的应用程序几乎从未被物理杀死。停用/激活总是在应用程序“暂停”的地方恢复我的应用程序。所有内存中的对象都未被触及

当设备资源不足时,会发生逻辑删除,必须“杀死”一些后台任务以释放内存。我相信当设备的屏幕保护程序下降,并且设备长时间处于待机状态时,也可能发生这种情况。逻辑删除实际上会杀死您的应用程序,所有内存中的对象都会被销毁/删除,等等。唯一幸存下来的是AppSettings和ISO存储。只有当您的应用程序处于停用状态时,才会发生逻辑删除

那么,你能看到什么样的生命周期

1) “冻结/备用/取消焦点”:

  • 发射
  • 。。。(工作)
  • 已停用(移动到后台)
  • 。。。(保存在内存中,可能进程/线程被冻结,但我怀疑)
  • (……)
  • 已激活(移动到前台,不进行导航)
  • 。。。(工作)
  • 结束
2) “墓碑”:

  • 发射
  • 。。。(工作)
  • 已停用(移动到后台)
  • 。。。(保存在内存中,可能进程/线程被冻结,但我怀疑)
  • 。。。(墓碑,从记忆中消失,一切都被摧毁)
  • (……)
  • 。。。(构建干净的应用程序对象)
  • 已激活(移动到前台)
  • 导航(我想,总是导航到清单中设置的第一个默认页面,但我现在不确定)
  • (工作)
  • 结束
这意味着,墓碑可能有点难以检测,但也意味着,您总是有时间尝试在停用的eventhandler中保持相同的状态

这也意味着(除非有一些我还不知道的通知服务),检测来自墓碑的简历的唯一方法是依靠。。。依赖于它最致命/最不愉快的影响:清除你的记忆

想象一个最简单的情况:你的App对象有一个属性“private bool\u-test”。它可以是任何类型的任何属性/字段。您也可以使用“对象视图模型{get;set}”来实现这一点

首先要记住的是,NOT在构造函数中设置它,并指定一个内联默认值。让它漂浮着。每当创建应用程序对象时,编译器/运行时都会将其设置为默认false