首页 > 解决方案 > 选择在后面的代码中生成的 NavigationView 的 MenuItem 时出现 UWP 图形故障

问题描述

我有一个 NavigationView 和一些在后面的代码中生成的 NavigationViewItems。从代码中,我试图选择一个 NavigationViewItem,它是在启动时向用户显示的默认项,并且我遇到了一种奇怪的行为(如果您选择在 xaml 中生成的 NavigationViewItem,则不会发生这种行为)。

当我启动应用程序时,我看不到选择(NavigationViewItem 左侧的强调色矩形),但是当我单击另一个 NavigationViewItem 时,矩形会显示并启动将其从旧 NavigationViewItem 移动到新的动画。

我遵循了在文档中找到的相同代码,但在文档中他们选择了在 xaml 中生成的 NavigationViewItem。 https://docs.microsoft.com/en-us/windows/uwp/design/controls-and-patterns/navigationview

图像以更好地显示问题

下面是重现问题的代码(项目最低版本和目标版本:Win10 FCU Build 16299)

XAML:

<NavigationView x:Name="navView" Loaded="navView_Loaded">

</NavigationView>

<Button Content="Select Mail" Click="button_Click" HorizontalAlignment="Center"/>

C#:

private void navView_Loaded(object sender, RoutedEventArgs e)
{
    navView.MenuItems.Add(new NavigationViewItem()
    { Content = "Home", Icon = new SymbolIcon(Symbol.Home), Tag = "home" });

    navView.MenuItems.Add(new NavigationViewItem()
    { Content = "My content", Icon = new SymbolIcon(Symbol.Folder), Tag = "content" });

    navView.MenuItems.Add(new NavigationViewItem()
    { Content = "Mail", Icon = new SymbolIcon(Symbol.Mail), Tag = "mail" });

    foreach (NavigationViewItemBase item in navView.MenuItems)
    {
        if (item is NavigationViewItem && item.Tag.ToString() == "home")
        {
            navView.SelectedItem = item;
            break;
        }
    }
}

private void button_Click(object sender, RoutedEventArgs e)
{
    navView.SelectedItem = navView.MenuItems.ElementAt(2);
}

标签: c#uwp

解决方案


问题是你在navView_Loaded导致SelectionIndicator动画终止时做了更多的事情。您可以await Task.Delay(500);在设置NavigationViewselectedItem 之前添加以验证这一点。

await  Task.Delay(500);
foreach (NavigationViewItemBase item in navView.MenuItems)
{
    if (item is NavigationViewItem && item.Tag.ToString() == "home")
    {

        navView.SelectedItem = item;
        (navView.SelectedItem as NavigationViewItem).IsSelected = true;
        break;
    }
}

对于您的方案,您可以在事件处理程序方法中添加MenuItemsLoading在 Loaded 事件处理程序方法中设置选择项。

private void navView_Loaded(object sender, RoutedEventArgs e)
{
    foreach (NavigationViewItemBase item in navView.MenuItems)
    {
        if (item is NavigationViewItem && item.Tag.ToString() == "home")
        {

            navView.SelectedItem = item;
            (navView.SelectedItem as NavigationViewItem).IsSelected = true;
            break;
        }
    }
}
private void navView_Loading(FrameworkElement sender, object args)
{
    navView.MenuItems.Add(new NavigationViewItem()
    { Content = "Home", Icon = new SymbolIcon(Symbol.Home), Tag = "home" });

    navView.MenuItems.Add(new NavigationViewItem()
    { Content = "My content", Icon = new SymbolIcon(Symbol.Folder), Tag = "content" });

    navView.MenuItems.Add(new NavigationViewItem()
    { Content = "Mail", Icon = new SymbolIcon(Symbol.Mail), Tag = "mail" });
}

推荐阅读