繁体   English   中英

选择在后台代码中生成的NavigationView的MenuItem时的UWP图形故障

[英]UWP Graphic glitch when selecting a MenuItem of a NavigationView generated in code behind

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

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

我遵循在文档中找到的相同代码,除了他们在文档中选择了在xaml中生成的NavigationViewItem。 https://docs.microsoft.com/zh-cn/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);
}

问题是您在navView_Loaded做了更多事情,导致SelectionIndicator动画终止。 您可以添加一个await Task.Delay(500); 在设置NavigationView selectedItem进行验证之前。

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;
    }
}

对于您的方案,您可以在Loading事件处理程序方法中添加MenuItems ,并在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" });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM