我有一个问题要问 WinRT XAML Toolkit 的创建者,它对我帮助很大。
在 WinRT 中处理丰富页面的最佳机制是什么?
这些是条件:
- 大约有 2 个页面有很多元素,背景中有一些高分辨率图像。显然,他们需要时间来加载内容。这就是为什么我使用
AlternativeFrame.Preload()
工具包中的方法。 - 这些页面也是最常用的。
这就是为什么我选择不断地预加载这些页面(创建、绘制、填充)但在需要时或创建我自己的页面缓存来存储它们(也许我是盲目的并且工具包已经具有此功能? ).
您能否建议解决这个问题的最佳实践是什么?是否还有第三种方法?
最佳答案
添加更多背景信息 - WinRT XAML 工具包库有两个控件:AlternativeFrame
和 AlternativePage
,它们是 Windows 8 SDK 中开箱即用的基本 Frame
和 Page
类的替代实现,用于处理 UI 导航 - 类似于您如何在网络浏览器中导航页面。这些替代控件的 API 与基本控件的 API 几乎相同,但它增加了对异步开发模型、页面转换动画以及在请求页面之前预加载页面的更多支持。
目前,Preload()
方法在后台预加载给定类型的页面并将其放入缓存中,当调用 Navigate()
方法导航到该类型的页面时,而不是实例化新页面 - 中的页面使用缓存,因此可以立即显示它,但是 - 缓存会被清空,下次您想要导航到同一页面时 - 您需要再次预加载它。如果您不经常返回预加载的页面并且该页面使用大量内存,那么这种方法很有效,但如果您想将该页面保留在缓存中 - 没有对此的内置支持。原始 Page 类有一个 NavigationCacheMode 属性,允许配置页面在第一次加载后保留在缓存中,这对您来说是一个不错的选择,但 AlternativePage
尚不支持。我今天正在考虑将其添加到那里,因为我有一些空闲时间,所以您可能会决定等我这样做。其他选项包括
- 在导航框架顶部显示您的页面,而不是在框架中导航到该页面 - 这样您就可以在需要时简单地显示/隐藏它
- 或者您可以切换回标准框架/页面控件,并在
NavigationCacheMode="Required"
上设置Page
,以便它永远保留在内存中,尽管您确实会失去Preload()
功能。 - 或者您可以自行修改工具包
- 或者您可以自己缓存页面的内容 - 只需将页面的
Content
保存在某种缓存中(例如,将页面类型映射到内容的Dictionary<Type,UIElement>
),并在以下情况下将其从页面中删除(将 Content 设置为 null):您离开该页面,然后在导航到该页面时将其添加回页面,并且在缓存中找到内容。在这种情况下,如果您从缓存中检索内容,您可能希望将Content
设为单独的UserControl
并跳过在构造函数中调用InitializeComponent()
,因为您只能拥有一个Content
并将其定义在单独的UserControl
中将允许您获得自动生成的代码在InitializeComponent()
中执行,使您可以轻松访问命名元素、注册事件处理程序等。
关于xaml - WinRT XAML 工具包预加载页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15357151/