我正在努力将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保留在内存中?
答案 0 :(得分:5)
您可以将NavigationCacheMode
设置为Page
至Enabled
或Required
(默认为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.frame.cachesize.aspx