【问题标题】:UWP Graphic glitch when selecting a MenuItem of a NavigationView generated in code behind选择在后面的代码中生成的 NavigationView 的 MenuItem 时出现 UWP 图形故障
【发布时间】:2018-05-04 17:57:21
【问题描述】:

我有一个 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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!你能解释一下为什么你的代码有效吗?使用我发布的内容并将&lt;NavigationView.MenuItems&gt; &lt;NavigationViewItem Content="Hello" Tag="hello"/&gt; &lt;/NavigationView.MenuItems&gt; 添加到XAML 中并使用&amp;&amp; item.Tag.ToString() == "hello" 更改.cs 可以正常工作!为什么在代码中生成的选择和项目会导致问题发生?还有,这是干什么用的? (navView.SelectedItem as NavigationViewItem).IsSelected = true; 即使仅使用这一行,该项目也会显示指标:navView.SelectedItem = item;
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2021-05-30
    • 1970-01-01
    相关资源
    最近更新 更多