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

标签 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的配置文件(很好),但是视图的状态被重置,而不是在“朋友”部分中,我返回到第一部分(在本例中为“详细信息”部分-从UX角度来看很烦人)。

我玩过NavigationHelper和SuspensionManager,并尝试将页面缓存设置为启用,但是我得到了一些意外的结果。如上文所述,如果我没有将NavigationCacheMode设置为Enabled,那么当我向后浏览时,我总是返回到第一个枢轴部分,但是,如果我确实将缓存模式设置为Enabled,则当我导航到配置文件页面的新实例时,状态似乎已被回收,而不是出现在新建配置文件的“详细信息”部分中,而是被加载到发生导航时所在的同一部分中(即,如果我位于用户1的“朋友”部分中,那么当我点击用户2时,我将位于用户2的“朋友”部分。从UX角度来看也很烦人。当我向后导航时,也会发生同样的情况,如果我的配置文件为4,然后查看配置文件4的“组”部分,当我回击时,我将查看配置文件3的“组”部分(即使我从“朋友”部分的个人资料3->个人资料4中导航)

你们当中有人经历过吗?我并不是在专门寻找代码片段(尽管我绝对不习惯于拒绝代码片段!),而是在思考如何处理代码片段的过程中。我知道有些应用程序会执行与此类似的操作,并且我确定我缺少一些小功能,但是任何建议都将不胜感激。

我要实现的这种相同类型的导航的一个示例是在Hulu App上。如果选择一个系列并滑到“推荐”部分,您将看到其他节目。轻按其中一个节目将打开该节目的详细信息(您可以多层浏览),但是点击“后退”按钮可将您带回到您上次观看的系列(最重要的是,还将使您回到“推荐”部分)

通常,我绝对会提供代码片段,但是由于这是一个更广泛的问题,而不是“为什么我的代码不起作用?”我决定推迟问题,仅在要求时才会等待提供摘要。

提前致谢!

最佳答案

在Windows Store应用程序中,页面缓存已变得更加灵活,但也变得更加复杂。现在,您可以灵活地实现像您一样的导航模式,但是您还必须手动做很多事情。

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

尽管如此,它仅将页面的一个实例保留在缓存中。就您而言,您可以使用不同的ID多次导航至该页面。启用导航缓存后,只需确保所有页面都位于页面的同一实例上即可。

我通常仅在应用程序的根页面包含大量数据(例如您的中心)时才对其进行缓存。

NavigationCache如果经常占用大量内存,因此在后台运行时,您的应用会更早关闭。小心使用。

通常,最好是每次导航到页面时都重新构建页面并缓存数据(如果是通过网络获取的)。

NavigationHelper提供了用于保存页面状态字典的简单标准实现。在后向导航上重新创建页面时,您仍然必须手动处理它的状态。

它只是为您提供了一个字典,您可以在其中保存值:您正在使用什么HubSection,滚动了多远等等。

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

一旦恢复字典,就必须设置HubSection,向下滚动等。

所以最后:是的,您必须手动完成所有操作...

关于c# - 通用Windows App C#-导航到同一页面的新实例时缓存页面的实例(和状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28076923/

相关文章:

c# - 项目无法编译

c# - WPF 将枚举绑定(bind)到组合框

c# - 是否可以继承 XAML?

c# - HtmlAgilityPack 使用 Linq for windows phone 8.1 平台

.net - 如何在 Windows Phone 8.1 中添加 AppBar

c# - MVC 3 成员资格和授权

C# ASP.Net MVC : RedirectFromLoginPage always goes to default url, 并且不返回 url

c# - 正则表达式不匹配时的自定义错误消息

c# - 我可以为 C# 函数中的参数或可选参数提供默认值吗?

c++ - WP8.1 认证 - 6.5.1 - 使用 XAML/C++ 的初始启动功能