Ric*_*ter 45 .net xaml windows-8 windows-runtime win-universal-app
我正在尝试用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
参考文献:
SuspensionManagerRic*_*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就不会禁用.
我确实找到了解决方案.我去了LayoutAwarePage.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",你可能会看到不同的行为.
谢谢,
约瑟夫欧文
当您向前导航时,可以在调用Frame.Navigate之前将NavigationCacheMode设置为Disabled吗?然后,在OnNavigatedTo()中将NavigationCacheMode再次设置为Enabled.
这应该使得当你向前导航时,禁用缓存.但是当你到达新的页面实例时,OnNavigatedTo会再次启用它.当您想要导航回来时,在调用Frame.GoBack之前不会触摸NavigationCacheMode.我认为这应该会给你缓存的实例.
我相信这会奏效,但我没有测试过.我很想知道它是否确实存在.那里有趣的场景.我很乐意看到应用程序在运行并更好地理解这种行为的使用.
| 归档时间: |
|
| 查看次数: |
15846 次 |
| 最近记录: |