ItemInvoked vs SelectionChanged

时间:2018-03-15 18:25:59

标签: events uwp navigation uwp-xaml

在Windows UWP中,ItemInvoked的{​​{1}}和SelectionChanged事件之间有什么区别? API reference

  

ItemInvoked
  当菜单中的项目收到诸如点击或点击之类的交互时发生。

     

的SelectionChanged
  当前所选项目更改时发生。

在我看来NavigationView可以检测何时通过点击SelectionChanged之外的其他方法进行导航,那么使用更好,更具包容性的选项会是什么?

或者每个用户有不同的用例吗?

3 个答案:

答案 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>