c# - 选择在后面的代码中生成的 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);
}
解决方案
问题是你在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;
}
}
对于您的方案,您可以在事件处理程序方法中添加MenuItems
并Loading
在 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" });
}
推荐阅读
- python - 如何在python中删除字符串周围的引号?
- java - 从javaFX中的数据库生成PDF调用信息
- android - 在某些 Android 设备上获取 nullPointerException onStart() 方法
- objective-c - 使用 Realm 查询嵌套对象数组的属性
- python - 获取所有房间的列表(Django 频道 2)
- go - 监听和服务的 Goroutine 阻塞主进程的执行,永远不会达到用于通信的以下选择状态
- php - 类内的 MySQLi 语句
- scala - 在 url 中写入 uri 模式
- python - 在 python 中运行使用 pyinstaller 和 Google Cloud API 集成构建的 exe 文件时出现错误
- google-sheets - 过滤,如果结果为 x,则替换为 y,或者如果结果为 a,则替换为 b