WinUI 2.8动态加载NavigationView后如何选中二级菜单项?
你遇到的问题本质是二级菜单项在NavigationView.Loaded事件触发时还未完成虚拟化加载——因为一级菜单默认是折叠状态,对应的二级菜单容器还没被创建,所以用ContainerFromMenuItem或VisualTreeHelper都找不到目标控件。
以下是可行的解决步骤:
1. 先展开目标一级父项并等待子菜单加载
在NavigationView.Loaded事件中,先找到一级父项对应的NavigationViewItem,将其设置为展开状态,然后通过监听Expanded事件确保子菜单容器实例化完成:
private void mainNav_Loaded(object sender, RoutedEventArgs e) { // 1. 定位目标一级数据项(通过自定义标识,比如Name属性) var targetParentItem = FirstLvelItems.FirstOrDefault(item => item.Name == "目标一级项名称"); if (targetParentItem == null) return; // 2. 获取一级父项的容器控件 var parentNavItem = mainNav.ContainerFromMenuItem(targetParentItem) as NavigationViewItem; if (parentNavItem == null) return; // 3. 展开一级父项,触发子菜单容器创建 parentNavItem.IsExpanded = true; // 4. 监听展开事件,确保子菜单加载完成 parentNavItem.Expanded += ParentNavItem_Expanded; }
2. 在Expanded事件中查找并选中二级菜单项
当一级父项展开后,子菜单容器已创建,此时可以通过数据项关联找到二级控件并设置选中:
private void ParentNavItem_Expanded(object sender, RoutedEventArgs e) { var parentNavItem = sender as NavigationViewItem; if (parentNavItem == null) return; // 取消监听避免重复触发 parentNavItem.Expanded -= ParentNavItem_Expanded; // 1. 定位目标二级数据项 var targetChildItem = (parentNavItem.DataContext as MyType)?.SecondLevelItems.FirstOrDefault(item => item.Name == "目标二级项名称"); if (targetChildItem == null) return; // 2. 获取二级项的容器控件 var childNavItem = parentNavItem.ContainerFromMenuItem(targetChildItem) as NavigationViewItem; if (childNavItem == null) return; // 3. 设置选中状态 mainNav.SelectedItem = childNavItem; // 可选:如果需要触发自定义导航逻辑,手动调用对应方法 // NavigateToPage(childNavItem.Tag.ToString()); }
极端场景补充
如果ContainerFromMenuItem在Expanded事件中仍找不到二级容器,可通过Dispatcher延迟执行查找(应对加载延迟):
parentNavItem.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { var childNavItem = parentNavItem.ContainerFromMenuItem(targetChildItem) as NavigationViewItem; if (childNavItem != null) { mainNav.SelectedItem = childNavItem; } });
注意:确保MyType类的SecondLevelItems为ObservableCollection<T>类型,保证数据与容器的正确绑定。
内容的提问来源于stack exchange,提问作者Dorel Pîslan
相关产品推荐
相关产品推荐

