WinRT/UWP框架和页面缓存:如何在Navigate()上创建新页面实例并将页面实例保留在GoBack()上

Ric*_*ter 45 .net xaml windows-8 windows-runtime win-universal-app

我正在尝试用C#创建一个UWP(通用Windows应用程序)应用程序.我的问题是Frame控制:如果我没有使用它NavigationCacheMode = Required,每次用户返回时,页面都不会保留在内存中并将被重新创建.如果我设置NavigationCacheModeRequiredEnabled返回正常工作(没有新页面对象),如果我导航到同一类型的另一个页面,则前一页面对象将被回收并重复使用(无新页面实例).

期望的行为:

有没有办法使用原始Frame控件具有以下行为(如在Windows Phone中):

  1. 在上创建新的页面实例 Navigate()
  2. 保持页面实例 GoBack()

我知道的唯一解决方案是创建一个自己的Frame控件,但这会导致其他问题(例如:缺少SetNavigationState()方法等...)

示例场景:

用三页的简单应用实例:TvShowListPage,TvShowDetailsPage,SeasonDetailsPage.

  1. TvShowListPage是入口页面.点击后TvShow导航到TvShowDetailsPage.
  2. 现在在TvShowDetailsPage列表中选择一个季节并导航到TvShowDetailsPage.
  3. 如果向后导航,页面应保留在内存中以避免重新加载页面.
  4. 但是如果用户回到TvShowListPage并选择另一个,TvShowTvShowDetailsPage回收并且可能处于错误的状态(例如显示投射枢轴而不是第一个,季节枢轴)

我正在寻找默认的Windows Phone 7行为:导航在页面堆栈上创建一个新页面,返回从堆栈中删除首页并显示堆栈中的上一页(存储在内存中).

解:

因为没有这个问题的解决方案,我不得不重新实现所有分页相关的类:Page,Frame,SuspensionManager等...

库MyToolkit它提供了所有这些类可以在这里下载:https://github.com/MyToolkit/MyToolkit/wiki/Paging-Overview

参考文献:

Ric*_*ter 17

因为没有这个问题的解决方案,我不得不重新实现所有分页相关的类:Page,Frame,SuspensionManager等...

解决方案可以在这里下载:https: //github.com/MyToolkit/MyToolkit/wiki/Paging-Overview

更新:

页面类现在还提供OnNavigatingFromAsync方法,以显示例如异步弹出窗口并在需要时取消导航...


小智 8

我有同样的问题.我想要它,当我在Metro(Windows Store适当)中前进时,它将创建一个新实例.但是,当返回时,它将保留我想要保存的数据.

所以,我同样使用了NavigationCacheMode = NavigationCacheMode.Enabled.我发现无论我走向,向前还是向后走,我都会保存所有东西.所以,我会前进几页,然后再退一些.希望一切都在我向前移动时重置,我总是发现它不是; 它保留了数据.

我尝试了一切,包括编写我自己的后退按钮代码以包含NavigationCacheMode = NavigationCacheMode.Disabled,但无济于事.正如其他人所指出的那样,一旦启用它,NavigationCacheMode就不会禁用.

我确实找到了解决方案.我去了La​​youtAwarePage.cs,只做了一个小改动.在"OnNavigatedTo"下我找到了这条线:

// Returning to a cached page through navigation shouldn't trigger state loading
if (this._pageKey != null) return;
Run Code Online (Sandbox Code Playgroud)

然而,评论与我想要的相反.我正在寻找单向模式的状态加载.如果前进,我想要状态加载; 如果向后移动我想要注释所指示的行为 - 没有状态加载.

所以我只是修改了这条线.

// Returning to a cached page through navigation shouldn't trigger state loading
if (this._pageKey != null && e.NavigationMode == NavigationMode.Back) return;
Run Code Online (Sandbox Code Playgroud)

我测试了它,它完美无缺.现在,当向后导航时,它会记住状态并使页面保持不变.向前导航,它加载新鲜.

也许不是最佳实践,但我不会从我的代码隐藏中调用"OnNavigatedTo".我通过"LoadState"做任何事情.如果你在代码隐藏中重写"OnNavigatedTo",你可能会看到不同的行为.

谢谢,

约瑟夫欧文


Jar*_*SFT 6

当您向前导航,可以在调用Frame.Navigate之前将NavigationCacheMode设置为Disabled吗?然后,在OnNavigatedTo()中将NavigationCacheMode再次设置为Enabled.

这应该使得当你向前导航时,禁用缓存.但是当你到达新的页面实例时,OnNavigatedTo会再次启用它.当您想要导航回来时,在调用Frame.GoBack之前不会触摸NavigationCacheMode.我认为这应该会给你缓存的实例.

我相信这会奏效,但我没有测试过.我很想知道它是否确实存在.那里有趣的场景.我很乐意看到应用程序在运行并更好地理解这种行为的使用.

  • 它似乎不起作用.一些发现:必须在构造函数中设置`NavigationCacheMode`才能生效.稍后更改属性(在导航时)没有任何影响...... (3认同)