UWP代码后台生成NavigationView选中NavigationViewItem时出现图形异常
我之前也碰到过完全一样的问题!动态生成的NavigationViewItem在应用启动时总是没法正常显示左侧的强调色选中标识,点其他项后反而会出现异常的视觉状态。折腾了好一会儿才找到几个靠谱的解决办法,分享给你:
1. 等NavigationView加载完成后再设置选中项
很多时候问题出在控件还没完全初始化就设置了SelectedItem,导致视觉状态没来得及更新。你可以把设置选中项的代码放到NavigationView的Loaded事件里,或者用Dispatcher延迟执行,确保控件已经准备好渲染所有Item了:
private void MyNavView_Loaded(object sender, RoutedEventArgs e) { // 假设你已经把动态生成的Item加到了MenuItems里,取第一个作为默认选中项 if (MyNavView.MenuItems.OfType<NavigationViewItem>().Any()) { var defaultItem = MyNavView.MenuItems.OfType<NavigationViewItem>().First(); MyNavView.SelectedItem = defaultItem; // 手动触发一次视觉状态更新,保险起见 UpdateSelectedItemVisualState(defaultItem); } }
2. 手动强制更新选中项的视觉状态
有时候即使设置了SelectedItem,控件的视觉状态管理器也没自动触发更新。这时候可以手动找到目标Item的容器,强制切换到Selected状态:
private void UpdateSelectedItemVisualState(NavigationViewItem selectedItem) { var container = MyNavView.ContainerFromItem(selectedItem) as NavigationViewItem; if (container != null) { // 强制切换到选中的视觉状态 VisualStateManager.GoToState(container, "Selected", true); } }
3. 同步设置Item的IsSelected属性
只设置NavigationView的SelectedItem有时候不够,最好同时给动态生成的Item本身设置IsSelected = true,确保两者状态同步:
// 动态生成Item时 var dynamicItem = new NavigationViewItem() { Content = "我的动态页面", Tag = "DynamicPage", Icon = new SymbolIcon(Symbol.Document), IsSelected = true // 加上这一行 }; MyNavView.MenuItems.Add(dynamicItem); // 再同步设置NavigationView的选中项 MyNavView.SelectedItem = dynamicItem;
4. WinUI 3用户额外注意:强制刷新布局
如果你用的是WinUI 3,有时候需要手动触发布局刷新来让选中状态显示出来:
MyNavView.SelectedItem = defaultItem; // 强制控件重新计算布局 MyNavView.InvalidateArrange(); MyNavView.UpdateLayout();
这些方法里,我最常用的是第一和第二种组合,基本能解决90%以上的这类问题。你可以先试试把设置选中项的代码挪到Loaded事件里,应该就能看到效果了!
内容的提问来源于stack exchange,提问作者Federico
相关产品推荐
相关产品推荐

