在我的UWP应用中,我想使用框架在两个(或更多(页之间导航。页面的内容由用户从列表中选择来确定。当选择列表更改时,frame.Navigate()
方法被调用:
FruitsFrame.Navigate(typeof(ApplePage));
这可以正常工作,但是每次称为Mothod时,都会创建一个新实例,从而丢弃对ApplePage进行的更改。
我的解决方案是将ApplePage
作为参数传递,但这觉得很不对劲。我可以使用
FruitsFrame.Content = applePage;
而是OnNavigatedTo
和OnNavigatedFrom
不会被调用。目前,我依靠这两个事件,请注意ApplePage中的开始和停止任务。
那么如何正确使用页面导航?我想到的唯一解决方案是建立一个包装类别,该类别具有与ViewModel非常相似的所有信息Neccesary(包括任务(。这是如何使用框架吗?
只需使用以下代码:
> public Page()
> {
> this.InitializeComponent();
> this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
> }
Frame
主要旨在作为导航堆栈的支架。因此,它可以保存当前显示的页面,打开页面的历史记录及其导航参数。如果启用了NavigationCache
并启用了单个页面的NavigationCacheMode
,它甚至可以将页面保存在内存中的导航堆栈中,包括其控件的状态。
在您的情况下,听起来我们不是在谈论基于"堆栈"的导航,而是类似" tabs"的内容 - 内容的多页应该保留在内存中并应恢复。在这种情况下,您有两个选择。
第一个是您已经发现的一个 - 将页面保存在内存中,并将其设置为内容控制的Content
。它不必是Frame
POR-SE,而是仅是简单的ContentControl
或ContentPresenter
。为了使事情变得更加干净,您可以使用UserControls
而不是Pages
,以使页面的导航方面显然不可用,并且不能意外依靠导航事件。
第二个解决方案是实际使用某种MVVM解决方案,这将使您可以保持内存中相关的ViewModel
,该解决方案将包含基于用户的状态并保持内存,而页面及其UI将被摧毁。这是可取的,因为基于UI的控件确实会应变存储器,并且简单的基于数据的视图模型将无与伦比便宜。在这种情况下,您将首先导航到该页面,然后检查视图模型定位器,以找到适当的视图模型的新实例或现有实例,将其设置为页面的DataContext
。MVVMlight已经从开箱即用了一个ViewModel定位器,因此可能非常适合您的需求。