【发布时间】:2012-07-18 10:56:23
【问题描述】:
我正在尝试使用 C# 创建 UWP(通用 Windows 应用程序)应用程序。我的问题是Frame 控件:如果我在没有NavigationCacheMode = Required 的情况下使用它,则每次用户返回时,页面都不会保存在内存中,而是会重新创建。如果我将NavigationCacheMode 设置为Required 或Enabled,返回工作正常(没有新的页面对象)但是如果我从相同类型导航到另一个页面,前一个页面对象将被回收并重用(没有新的页面实例)。
期望的行为:
有没有办法使原始Frame 控件(如在 Windows Phone 中)具有以下行为:
- 在
Navigate()上创建新页面实例 - 将页面实例保持在
GoBack()
我知道的唯一解决方案是创建一个自己的Frame 控件,但这会导致其他问题(例如:缺少SetNavigationState() 方法等...)
示例场景:
三个页面的简单应用示例:TvShowListPage、TvShowDetailsPage、SeasonDetailsPage。
-
TvShowListPage是入口页面。单击TvShow后导航到TvShowDetailsPage。 - 现在在
TvShowDetailsPage的列表中选择一个季节并导航到TvShowDetailsPage。 - 如果向后导航,页面应保留在内存中以避免重新加载页面。
- 但如果用户返回
TvShowListPage并选择另一个TvShow,则TvShowDetailsPage会被回收并且可能处于错误状态(例如,显示演员轴心而不是第一个季节轴心)
我正在寻找默认的 Windows Phone 7 行为:导航在页面堆栈上创建一个新页面,返回从堆栈中删除顶部页面并显示堆栈中的前一页(存储在内存中)。
解决方案:
因为没有解决这个问题,我不得不重新实现所有与分页相关的类:Page、Frame、SuspensionManager 等...
提供所有这些类的库 MyToolkit 可以在这里下载:https://github.com/MyToolkit/MyToolkit/wiki/Paging-Overview
参考资料:
- http://www.jayway.com/2012/05/25/clearing-the-windows-8-page-cache/: 没有好的解决方案
-
http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/88e6d1b3-1fa6-4ab4-a816-e77c86ef236f/:实现自己的 Frame 类不是解决方案,因为它不适用于
SuspensionManager
【问题讨论】:
-
这可能是 Windows 8 上最烦人的事情之一。感谢您的解决方案!
标签: .net xaml windows-8 windows-runtime win-universal-app