You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI 2.8动态加载NavigationView后如何选中二级菜单项?

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:22:08