通用Windows应用程序C# - 导航到同一页面的新实例时,缓存页面的实例(和状态)

时间:2015-01-21 21:13:32

标签: c# xaml windows-phone-8.1 windows-8.1 win-universal-app

您好StackOverflow社区,

我正在使用C#和XAML中的Windows通用应用程序。到目前为止,进展顺利(整个框架非常容易使用)但是我遇到了与页面导航和状态缓存相关的问题,我希望能得到一些帮助。

在标准模板中,通过应用导航将如下所示: 主页 - >个人资料(ID 1) - >游戏(ID 120) - > (返回)简档(ID 1) - > (返回)首页 - >个人资料(ID 2) - >游戏(ID 210)

但是,我想做这样的事情: 主页 - >个人资料(ID 1) - >个人资料(ID 2) - >个人资料(ID 3) - >游戏(ID 120)

此要求背后的原因很简单:个人资料页面包含该个人资料的朋友,群组,游戏等列表。点击朋友应该会将您带到他们的个人资料页面,然后您可以从那里查看他们的详细信息,他们的朋友等,并继续深入查看朋友列表或组(可以链接回个人资料)。

这很重要,因为我在SO上遇到的大部分问题都与此有关......但是我已经能够像我列出的那样正确地在列表中来回导航第二个例子。我遇到的问题来自导航过程中一些有趣的缓存和状态问题。

为简单起见,我们来谈谈Windows Phone视图;配置文件页面包含一个包含四个部分(详细信息,游戏,朋友,组)的数据透视表。如果我在用户1的个人资料上,请轻扫到好友栏目,然后点击用户2的个人资料,然后导航就会出现,我的后台堆栈中有3个页面(主页,用户1的个人资料,个人资料对于用户2)。这不是我遇到麻烦的部分;我遇到的问题与向后导航有关 - 当我点击后退按钮并向后导航到框架时,我返回到用户1的配置文件(这很好),但视图的状态被重置,而不是在朋友'部分我将返回到第一部分(在这种情况下,'详细信息'部分 - 从用户体验的角度来看很烦人。)

我已经使用了NavigationHelper和SuspensionManager,并尝试将页面缓存设置为启用,但是我得到了一些意想不到的结果。如上所述,如果我没有将NavigationCacheMode设置为Enabled,那么当我向后导航时,我总是返回到第一个数据透视部分,但是如果我将缓存模式设置为Enabled,那么当我导航到配置文件的新实例时页面然后状态似乎被回收,而不是出现在'细节'对于新配置文件的部分,我被加载到导航发生时我所在的同一部分(即,如果我在用户1的“朋友”部分,那么当我点击用户2时,我将在用户2的“朋友”部分。从UX的角度来看也很烦人)。当我向后导航时也是如此,如果我有4个深度剖析并且正在查看'群组'对于个人资料4的部分,当我回击时,我会看到群组'个人资料3的部分(即使我从个人资料3导航 - >'朋友'部分)

这是你们任何人经历过的事吗?我并没有特别寻找代码片段(虽然我绝对没有把它们拒绝的习惯!),但更多的是关于如何处理这个问题的思考过程。我知道有些应用程序会做类似的事情,我确信我错过了一些小事,但我会非常感激任何建议。

我尝试实现的同类导航示例将在Hulu App上。如果您选择了一个系列,请滑动到“推荐”系列。部分你会看到其他节目。点击其中一个节目将打开该节目的详细信息(并且您可以深入多层),但是点击后退按钮将返回到您查看的最后一个系列(最重要的是,还会让您重新开始推荐的'部分)

通常情况下,我绝对会提供代码片段,但由于这是一个更广泛的问题,而不是"为什么我的代码不起作用?"问题我决定推迟,只有在被要求时才会提供片段。

提前致谢!

1 个答案:

答案 0 :(得分:2)

页面缓存已经变得更加灵活,但在Windows应用商店应用中也变得更加复杂。您现在可以灵活地实现像您这样的导航模式,但您还必须手动执行大量操作。

首先是 NavigationCache :您可以在页面上启用它(但仅限于构造函数中)。 要使Cache正常工作,您还必须设置CacheSize(它在默认的App.xaml.cs中并设置为1.您必须将其增加才能正常工作。

但是,它只在缓存中保留一个页面实例。在您的情况下,您使用不同的ID多次导航到该页面。启用导航缓存后,它将确保所有登陆页面的同一个实例。

我通常只会缓存应用的根页面,并且只有当它包含大量数据时(例如您的中心)。

NavigationCache如果用于经常填满大量内存,因此你的应用程序在放入后台时会提前关闭。小心使用。

通常最好只在每次导航时重新构建页面,然后只缓存数据(如果通过网络获取)。

NavigationHelper 提供了一种简单的标准实现,用于保存页面的状态字典。当您的页面在后退导航中重新创建时,您仍然需要手动处理它的状态。

它只是为您提供了一个字典,您可以在其中保存值:您所在的HubSection,滚动的距离等等。

它利用 BackStackDepth 为您所在的页面提供正确的词典。

一旦你收回字典,就必须设置HubSection,向下滚动等等。

所以最后:是的,你必须手工完成所有这些......