Frame
中有MainPage
,MainPage
中有List
内容,例如,loadList()
是由函数动态生成的({&1}} #39; s称之为Loaded
)由MainPage
List
事件调用。
用户在Frame
中的任何项目上进行陈词滥调后,DetailPage
可以导航到另一个页面(我们可以调用此MainPage
)。每当我从DetailPage
导航回MainPage
时,Loaded
都会调用loadList()
事件,因此会再次调用{{1}}。
我的问题是,是否有任何方法可以保持内容的状态并防止内容在生成后再次生成?
答案 0 :(得分:0)
默认情况下,UWP页面会在用户导航时卸载。这很有用,因为它可以节省内存。当用户返回页面时,页面将再次加载。
您可以通过在页面上设置NavigationCacheMode
property来更改此行为:
<Page
...
NavigationCacheMode="Required">
如果您将NavigationCacheMode
设置为Enabled
或Required
,则该页面将被缓存,并在用户导航回来时恢复。页面的Loaded
事件仍将被调用,但您可以通过直接检查控件或检查后设置的bool
标志变量来检查数据是否已初始化初始化:
private void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
if (!initialized)
{
loadList();
initialized = true;
}
}
Enabled
和Required
之间的区别在于Enabled
尊重CacheSize
上的Frame
设置。一旦存储的缓存页面超过限制,Frame
将自动从内存中删除最旧的页面。 Required
个页面不会计入此限制,也不会被删除。
此解决方案的一个稍好的替代方案是使用MVVM设计模式。在此模式中,视图的数据存储在ViewModel
类中,并且许多MVVM框架为内存中的导航堆栈中的页面维护ViewModels
。这意味着您的页面将被重新加载,但数据将在视图模型中可用,因此它将加载快速。 MVVM是开发UWP应用程序的推荐模式,因此我强烈建议您尝试Prism,MvvmLight或MvvmCross。