Windows应用商店应用中的导航 - 在反向导航中重新创建页面?

时间:2014-02-11 13:57:37

标签: c# windows-runtime windows-store-apps windows-8.1

我正在努力将Windows Phone 8应用程序移植到Windows应用商店8.1,我对Win 8.1上的页面导航如何工作感到困惑。它似乎与WP 8完全不同:

给定:PageA作为主页面和其他一些页面PageB。 导航:启动应用,向前导航到B并返回到A

Windows Phone 8:

 - Constructor of PageA
 - PageA.OnNavigatedTo()...
 - PageA was just created? Ok, create ViewModel   

 - Click some Button to navigate to PageB
 - Creation of PageB + actual Navigation...  
 - Click some Button to navigate back to PageA

 - PageA.OnNavigatedTo()...
 - PageA was just created? No, use existing ViewModel

Windows应用商店应用8.1:

 - Constructor of PageA
 - PageA.OnNavigatedTo()...
 - PageA was just created? Ok, create ViewModel   

 - Click some Button to navigate to PageB
 - Creation of PageB + actual Navigation...  
 - Click some Button to navigate back to PageA

 - Constructor of PageA
 - PageA.OnNavigatedTo()...
 - PageA was just created? Ok, create ViewModel

不同之处在于如何处理后退导航。在WP 8上,只使用了PageA的现有实例,Win 8.1创建了一个完整的PageA新实例。因此,必须重新创建ViewModel ......

在Win 8.1中,将导航到页面没有区别。 这是对的吗?或者我做错了什么?

在某些页面上创建视图模型是相当多的工作。当导航到PageB并在导航回来时重新创建它时,如何丢弃现有的PageA?当然这可以节省内存,但是如果Windows Phone可以在堆栈上处理不同的页面,Win 8.1应该能够做同样的事情,不应该吗?

当然,导航离开PageA时可以保存视图模型并加载而不是在导航回来时重新创建。但是因此视图模型必须是可序列化的,而且混合ViewModel非常复杂。

有没有办法让Pages保留在内存中?

1 个答案:

答案 0 :(得分:5)

您可以将NavigationCacheMode设置为PageEnabledRequired(默认为Disabled):

public BasicPage1()
{
    this.InitializeComponent();

    this.NavigationCacheMode = 
        Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
}  

您还可以设置要为Frame.CacheSize的框架缓存的页数(默认为10)。

msdn links:

http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.page.navigationcachemode.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.frame.cachesize.aspx