如何在导航期间保留内容的状态?

时间:2018-02-18 00:31:27

标签: c# uwp

Frame中有MainPageMainPage中有List内容,例如,loadList()是由函数动态生成的({&1}} #39; s称之为Loaded)由MainPage List事件调用。

用户在Frame中的任何项目上进行陈词滥调后,DetailPage可以导航到另一个页面(我们可以调用此MainPage)。每当我从DetailPage导航回MainPage时,Loaded都会调用loadList()事件,因此会再次调用{{1}}。

我的问题是,是否有任何方法可以保持内容的状态并防止内容在生成后再次生成?

1 个答案:

答案 0 :(得分:0)

默认情况下,UWP页面会在用户导航时卸载。这很有用,因为它可以节省内存。当用户返回页面时,页面将再次加载。

您可以通过在页面上设置NavigationCacheMode property来更改此行为:

<Page 
   ...
   NavigationCacheMode="Required">

如果您将NavigationCacheMode设置为EnabledRequired,则该页面将被缓存,并在用户导航回来时恢复。页面的Loaded事件仍将被调用,但您可以通过直接检查控件或检查后设置的bool标志变量来检查数据是否已初始化初始化:

private void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
    if (!initialized)
    {
        loadList();
        initialized = true;
    }
}

EnabledRequired之间的区别在于Enabled尊重CacheSize上的Frame设置。一旦存储的缓存页面超过限制,Frame将自动从内存中删除最旧的页面。 Required个页面不会计入此限制,也不会被删除。

此解决方案的一个稍好的替代方案是使用MVVM设计模式。在此模式中,视图的数据存储在ViewModel类中,并且许多MVVM框架为内存中的导航堆栈中的页面维护ViewModels。这意味着您的页面将被重新加载,但数据将在视图模型中可用,因此它将加载快速。 MVVM是开发UWP应用程序的推荐模式,因此我强烈建议您尝试PrismMvvmLightMvvmCross