【问题标题】:UWP NavigationView multiple pages of same typeUWP NavigationView 多个相同类型的页面
【发布时间】:2018-12-09 18:44:59
【问题描述】:

我允许用户在导航窗格中添加额外的导航项。所有这些都具有相同的页面类型 (SCWebViewPage)。问题是导航时,您只提供类型而不是实例。显然,我可以使用对象参数来指定应该加载哪个视图。但是,我将无法使用导航缓存。有什么想法吗?谢谢。

【问题讨论】:

  • 问题是你不能使用NavigationCacheMode?因为它不存储(缓存)虽然页面类型相同但内容不同..

标签: c# xaml uwp uwp-xaml


【解决方案1】:

UWP 的Frame 只允许使用Navigate(Type pageType, object parameter) 方法导航到页面类型。这意味着新导航总是会创建页面的新实例。您无法导航到现有实例(尽管可以将页面实例分配Frame.Content,但这不是正确的方法,并且违背了Frame 的全部目的)。 p>

您可以做的是提供一个parameter,页面将使用它来了解应该显示的内容。我认为让您感到困惑的是,许多示例在菜单项上使用标签参数来定义应导航到的页面类型,但是您可以轻松地使用任意字符串,然后您可以利用该字符串来了解您想要导航的位置例如。有关类似方法,请参阅此blogpost。作为示例,请参见:

<NavigationViewItem Icon="Home" Tag="FirstPage">
   <TextBlock>First</TextBlock>
</NavigationViewItem>
<NavigationViewItem Icon="Setting" Tag="SecondPage">
   <TextBlock>Second</TextBlock>
</NavigationViewItem>

现在在处理项目选择的代码中:

private void nvTopLevelNav_ItemInvoked(NavigationView sender, 
                                       NavigationViewItemInvokedEventArgs args)
{
     var item = args.InvokedItemContainer;
     if (item != null)
     {
           switch (item.Tag)
           {
               case "FirstPage":
                  contentFrame.Navigate(typeof(SCWebViewPage), "someParam");
               break;

               case "SecondPage":
                  contentFrame.Navigate(typeof(SCWebViewPage), "differentParam");
               break;
           }
     }
}

现在在SCWebViewPage 代码中,您可以覆盖OnNavigatedTo 方法,检查parameter 并采取相应措施:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.Parameter == "someParameter") ...
    else ...
}

只要导航参数是可序列化类型(string 肯定是),这绝不会影响您的应用程序的功能,您甚至可以完全存储和重新加载暂停时的Frame 导航状态/恢复。

【讨论】:

  • 嗨,马丁,谢谢。是的 - 这实际上是我最终做的。最初的问题是我希望能够缓存两者,因此用户不必每次都等待页面加载。我最终做的是创建自己的缓存破解。在从页面导航时,我拍摄屏幕的位图图像,在返回时,我在内容加载时显示位图。至少可以说是一个讨厌的 hack,但它满足了我的要求
  • 如果您在 ViewModel 中拥有持久化的数据,那么从新页面绑定到现有视图模型的数据也应该非常直接。您可以查看 MVVM 模式通常如何处理这个问题 - 例如在 MvvmCross 或 Prism 库中
猜你喜欢
  • 1970-01-01
  • 2019-06-25
  • 2019-03-22
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
相关资源
最近更新 更多