UWP在导航上存储框架

时间:2018-04-04 20:59:23

标签: uwp navigation frame

在我的UWP应用程序中,我想使用框架在两个(或更多)页面之间导航。页面的内容由用户通过从列表中选择来确定。当列表的选择发生变化时,将调用frame.Navigate()方法:

FruitsFrame.Navigate(typeof(ApplePage));

这很好用,但每次调用mothod时都会创建一个新实例,从而放弃对ApplePage所做的更改。

我的工作方式是将ApplePage作为参数传递,但这感觉非常错误。 我可以用

FruitsFrame.Content = applePage;

相反,但OnNavigatedToOnNavigatedFrom不会被调用。目前我依赖于这两个事件,因为ApplePage中的启动和停止任务。

那我怎样才能正确使用页面导航?我想到的唯一解决方案是构建一个包装类,它包含所有必要的信息(包括任务),这些信息与viewModel非常相似。这是框架的用途吗?

2 个答案:

答案 0 :(得分:1)

只需使用以下代码:

>         public Page()
>         {
>             this.InitializeComponent();
>             this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
>         }

答案 1 :(得分:0)

Frame主要用作导航堆栈的持有者。因此,它可以保存当前显示的页面,打开的页面的历史及其导航参数。如果启用了NavigationCache并且启用了单个页面的NavigationCacheMode,它甚至可以将导航堆栈中的页面保留在内存中,包括其控件的状态。

在你的情况下,听起来我们并不是在谈论基于“堆栈”的导航,而是像“标签”这样的东西 - 多页内容应该留在内存中并且应该被恢复。在这种情况下,您有两个选择。

第一个是您已经发现的内容 - 将页面保留在内存中并将其设置为内容控件的Content。它不必是Frame本身,而是可以只是一个简单的ContentControlContentPresenter。为了使事情变得更加清晰,您可以使用UserControls代替Pages,这样页面的导航方面显然不可用,您不会无意中依赖导航事件。

第二个解决方案是实际使用某种MVVM解决方案,这将允许您在内存中保留关联的ViewModel,其中包含基于用户的状态并将保留在内存中,而页面它的UI将被销毁。这是优选的,因为基于UI的控件确实会使内存紧张,并且基于数据的简单视图模型将无比便宜。在这种情况下,您将首先导航到该页面,然后检查视图模型定位器,以查找相应视图模型的新实例或现有实例,您可以将其设置为页面的DataContext。 MvvmLight已经提供了一个开箱即用的ViewModel定位器,因此它可能非常适合您的需求。