使用WinUI3
当选择更改为另一个菜单项时,有什么方法可以折叠导航菜单项吗?
我尝试在“选择更改”事件中迭代菜单的所有选项,如果不是所选项目,则将“IsExpanded”属性设置为“false”。这可行,但不幸的是破坏了菜单选择指示器及其动画。
以下代码有效,但我需要手动刷新
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);
}