在Windows UWP中,ItemInvoked
的{{1}}和SelectionChanged
事件之间有什么区别? API reference州
ItemInvoked
当菜单中的项目收到诸如点击或点击之类的交互时发生。的SelectionChanged
当前所选项目更改时发生。
在我看来NavigationView
可以检测何时通过点击SelectionChanged
之外的其他方法进行导航,那么使用更好,更具包容性的选项会是什么?
或者每个用户有不同的用例吗?
答案 0 :(得分:1)
主要区别在于SelectionChanged
事件只执行一次,但如果重复单击所选项,则不会触发。另一方面,ItemInvoked
将在每次单击项目时执行,即使它已被选中。
此外,当您在代码中手动设置SelectionChanged
时,将执行SelectedItem
事件。
答案 1 :(得分:0)
可能需要注意的另一件事是ItemInvoked
点击SelectionChanged
项目之前NavigationView
之前会触发
答案 2 :(得分:0)
我最近遇到了这个问题,在使用SelectionChanged事件时遇到了问题。连续单击同一菜单项不会产生任何结果。
然后,我发现了此博客文章(https://blogs.msdn.microsoft.com/appconsult/2018/05/06/using-the-navigationview-in-your-uwp-applications/),出于与答案#1相同的原因,建议使用ItemInvoked
事件。
如博客中所述,这对我不起作用,但是在更改代码以使用InvokedItemContainer
Tag属性后,该解决方案就可以正常工作。
我已经包含了用于验证解决方案的测试代码。
private void NvTopLevelNav_ItemInvoked(NavigationView sender, NavigationViewItemInvokedEventArgs args)
{
if (args.IsSettingsInvoked)
{
contentFrame.Navigate(typeof(SettingsPage));
}
else
{
string navTo = args.InvokedItemContainer.Tag.ToString();
if ( navTo != null)
{
switch (navTo)
{
case "Nav_Home":
contentFrame.Navigate(typeof(HomePage));
break;
case "Nav_Shop":
contentFrame.Navigate(typeof(ShopPage));
break;
case "Nav_ShopCart":
contentFrame.Navigate(typeof(CartPage));
break;
case "Nav_Message":
contentFrame.Navigate(typeof(MessagePage));
break;
case "Nav_Print":
contentFrame.Navigate(typeof(PrintPage));
break;
}
}
}
}
<Grid>
<NavigationView x:Name="nvTopLevelNav"
Loaded="NvTopLevelNav_Loaded"
Margin="0,12,0,0"
SelectionChanged="NvTopLevelNav_SelectionChanged"
ItemInvoked="NvTopLevelNav_ItemInvoked"
IsTabStop="False"
Header="Lets Go Shopping">
<NavigationView.MenuItems>
<NavigationViewItem Icon="Home" Content="Home" Tag="Nav_Home" />
<NavigationViewItem Icon="Shop" Content="Shop" Tag="Nav_Shop" />
<NavigationViewItem Content="Shopping Cart" Tag="Nav_Cart">
<NavigationViewItem.Icon>
<FontIcon Glyph="[Insert Hex Decimal Value Here. See Segoe MDL2 below for details.]"/>
</NavigationViewItem.Icon>
</NavigationViewItem>
<NavigationViewItem Icon="Message" Content="Message" Tag="Nav_Message" />
<NavigationViewItem Icon="Print" Content="Print" Tag="Nav_Print" />
</NavigationView.MenuItems>
<Frame x:Name="contentFrame"></Frame>
</NavigationView>
</Grid>