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

And*_*ord 2 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
Run Code Online (Sandbox Code Playgroud)

Windows应用商店App 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
Run Code Online (Sandbox Code Playgroud)

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

这似乎在Win 8.1存在的导航没有什么区别来自一个页面.这是正确的吗?或者我做错了什么?

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

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

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

w.b*_*w.b 5

您可以设置NavigationCacheMode一个PageEnabled或者Required(默认情况下它是Disabled):

public BasicPage1()
{
    this.InitializeComponent();

    this.NavigationCacheMode = 
        Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
}  
Run Code Online (Sandbox Code Playgroud)

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

msdn链接:

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