在我的UWP应用程序中,我想使用框架在两个(或更多)页面之间导航。页面的内容由用户通过从列表中选择来确定。当列表的选择发生变化时,将调用frame.Navigate()
方法:
FruitsFrame.Navigate(typeof(ApplePage));
这很好用,但每次调用mothod时都会创建一个新实例,从而放弃对ApplePage所做的更改。
我的工作方式是将ApplePage
作为参数传递,但这感觉非常错误。
我可以用
FruitsFrame.Content = applePage;
相反,但OnNavigatedTo
和OnNavigatedFrom
不会被调用。目前我依赖于这两个事件,因为ApplePage中的启动和停止任务。
那我怎样才能正确使用页面导航?我想到的唯一解决方案是构建一个包装类,它包含所有必要的信息(包括任务),这些信息与viewModel非常相似。这是框架的用途吗?
答案 0 :(得分:1)
只需使用以下代码:
> public Page()
> {
> this.InitializeComponent();
> this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
> }
答案 1 :(得分:0)
Frame
主要用作导航堆栈的持有者。因此,它可以保存当前显示的页面,打开的页面的历史及其导航参数。如果启用了NavigationCache
并且启用了单个页面的NavigationCacheMode
,它甚至可以将导航堆栈中的页面保留在内存中,包括其控件的状态。
在你的情况下,听起来我们并不是在谈论基于“堆栈”的导航,而是像“标签”这样的东西 - 多页内容应该留在内存中并且应该被恢复。在这种情况下,您有两个选择。
第一个是您已经发现的内容 - 将页面保留在内存中并将其设置为内容控件的Content
。它不必是Frame
本身,而是可以只是一个简单的ContentControl
或ContentPresenter
。为了使事情变得更加清晰,您可以使用UserControls
代替Pages
,这样页面的导航方面显然不可用,您不会无意中依赖导航事件。
第二个解决方案是实际使用某种MVVM解决方案,这将允许您在内存中保留关联的ViewModel
,其中包含基于用户的状态并将保留在内存中,而页面它的UI将被销毁。这是优选的,因为基于UI的控件确实会使内存紧张,并且基于数据的简单视图模型将无比便宜。在这种情况下,您将首先导航到该页面,然后检查视图模型定位器,以查找相应视图模型的新实例或现有实例,您可以将其设置为页面的DataContext
。 MvvmLight已经提供了一个开箱即用的ViewModel定位器,因此它可能非常适合您的需求。