UWP NavigationView 多个相同类型的页面
UWP NavigationView multiple pages of same type
我允许用户向导航窗格添加其他导航项。所有这些都具有相同的页面类型 (SCWebViewPage
)。问题是导航时,您只提供类型而不是实例。显然,我可以使用对象参数来指定应该加载哪个视图。但是我将无法使用导航缓存。有什么想法吗?谢谢。
UWP 的 Frame
仅允许使用 Navigate(Type pageType, object parameter)
方法导航到页面类型。这意味着新导航 always 会创建页面的新实例。您无法导航到现有实例(尽管可以 分配 页面实例到 Frame.Content
但这不是正确的方法并且违背了 Frame
).
你可以做的是提供一个 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
suspension/restore 上的导航状态。
我允许用户向导航窗格添加其他导航项。所有这些都具有相同的页面类型 (SCWebViewPage
)。问题是导航时,您只提供类型而不是实例。显然,我可以使用对象参数来指定应该加载哪个视图。但是我将无法使用导航缓存。有什么想法吗?谢谢。
UWP 的 Frame
仅允许使用 Navigate(Type pageType, object parameter)
方法导航到页面类型。这意味着新导航 always 会创建页面的新实例。您无法导航到现有实例(尽管可以 分配 页面实例到 Frame.Content
但这不是正确的方法并且违背了 Frame
).
你可以做的是提供一个 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
suspension/restore 上的导航状态。