WinUI 3:如何在更改选择时折叠导航菜单项

问题描述 投票:0回答:1

使用WinUI 3

当选择更改为另一个菜单项时,有什么方法可以折叠导航菜单项吗?

我尝试在“选择更改”事件中迭代菜单的所有选项,如果不是所选项目,则将“IsExpanded”属性设置为“false”。这可行,但不幸的是破坏了菜单选择指示器及其动画。

c# xaml winui-3 .net-8.0
1个回答
0
投票

以下代码有效,但我需要手动刷新

IsChildSelected

<NavigationView SelectionChanged="NavigationView_SelectionChanged">
    <NavigationView.MenuItems>
        <NavigationViewItem Content="Menu A">
            <NavigationViewItem.MenuItems>
                <NavigationViewItem Content="A-1">
                    <NavigationViewItem.MenuItems>
                        <NavigationViewItem Content="A-1-1" />
                        <NavigationViewItem Content="A-1-2" />
                    </NavigationViewItem.MenuItems>
                </NavigationViewItem>
                <NavigationViewItem Content="A-2" />
            </NavigationViewItem.MenuItems>
        </NavigationViewItem>
        <NavigationViewItem Content="Menu B">
            <NavigationViewItem.MenuItems>
                <NavigationViewItem Content="B-1" />
                <NavigationViewItem Content="B-2">
                    <NavigationViewItem.MenuItems>
                        <NavigationViewItem Content="B-2-1" />
                        <NavigationViewItem Content="B-2-2" />
                        <NavigationViewItem Content="B-2-3" />
                    </NavigationViewItem.MenuItems>
                </NavigationViewItem>
            </NavigationViewItem.MenuItems>
        </NavigationViewItem>
    </NavigationView.MenuItems>
</NavigationView>
private void NavigationView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
    foreach (var item in GetAllNavigationViewItems(sender))
    {
        RefreshIsChildSelected(item);
        item.IsExpanded = item.IsChildSelected;
    }
}

private IEnumerable<NavigationViewItem> GetAllNavigationViewItems(NavigationView navigationView)
{
    foreach (var childItem in  navigationView.MenuItems.OfType<NavigationViewItem>())
    {
        yield return childItem;

        foreach (var grandChildItem in GetAllNavigationViewItems(childItem))
        {
            yield return grandChildItem;
        }
    }
}

private IEnumerable<NavigationViewItem> GetAllNavigationViewItems(NavigationViewItem navigationViewItem)
{
    foreach (var childItem in navigationViewItem.MenuItems.OfType<NavigationViewItem>())
    {
        yield return childItem;

        foreach (var grandChildItem in GetAllNavigationViewItems(childItem))
        {
            yield return grandChildItem;
        }
    }
}

private void RefreshIsChildSelected(NavigationViewItem item)
{
    var childItems = item.MenuItems.OfType<NavigationViewItem>().ToList();

    foreach (var childItem in childItems)
    {
        RefreshIsChildSelected(childItem);
    }

    item.IsChildSelected = childItems.Any(x => x.IsSelected is true || x.IsChildSelected is true);
}
© www.soinside.com 2019 - 2024. All rights reserved.