UWP NavigationView多个相同类型的页面

时间:2018-12-08 08:14:29

标签: c# xaml uwp uwp-xaml

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

1 个答案:

答案 0 :(得分:2)

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

您可以做的是提供一个parameter,页面将使用它来显示应该显示的内容。我认为让您感到困惑的是,许多示例使用菜单项上的tag参数来定义应导航到的页面类型,但是您可以轻松地使用任意字符串,然后利用该字符串来了解要导航到的位置。例如。有关类似方法,请参见此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导航暂停/恢复状态。