From 3e007c09056b07a697fdc4e166cc1ae2cdc99719 Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Sat, 11 Oct 2025 21:55:13 +0800 Subject: [PATCH] Implement NavMenu to select the specified path by default --- src/AtomUI.Controls/NavMenu/NavMenu.cs | 55 ++++++++++++++++++++------ 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/AtomUI.Controls/NavMenu/NavMenu.cs b/src/AtomUI.Controls/NavMenu/NavMenu.cs index ba2d937a3..fbdce31c0 100644 --- a/src/AtomUI.Controls/NavMenu/NavMenu.cs +++ b/src/AtomUI.Controls/NavMenu/NavMenu.cs @@ -449,18 +449,34 @@ public class NavMenu : NavMenuBase HandleModeChanged(); } - protected void ConfigureDefaultOpenedPaths() + private void ConfigureDefaultOpenedPaths() { if (DefaultOpenPaths != null) { foreach (var defaultOpenPath in DefaultOpenPaths) { - var itemPath = FindMenuItemByPath(defaultOpenPath); - OpenMenuItemPaths(itemPath); + var pathNodes = FindMenuItemByPath(defaultOpenPath); + OpenMenuItemPaths(pathNodes); } } } + private void ConfigureDefaultSelectedPath() + { + if (DefaultSelectedPath != null) + { + var pathNodes = FindMenuItemByPath(DefaultSelectedPath); + Dispatcher.UIThread.InvokeAsync(async () => + { + var navMenuItems = await OpenMenuItemPathAsync(pathNodes); + foreach (var navMenuItem in navMenuItems) + { + navMenuItem.IsSelected = true; + } + }); + } + } + private IList FindMenuItemByPath(TreeNodePath treeNodePath) { if (treeNodePath.Length == 0) @@ -506,18 +522,34 @@ public class NavMenu : NavMenuBase }); } - private async Task OpenMenuItemPathAsync(IList pathNodes) + private async Task> OpenMenuItemPathAsync(IList pathNodes) { - ItemsControl current = this; - foreach (var pathNode in pathNodes) + List items = new List(); + try { - var child = await GetNavMenuItemContainerAsync(pathNode, current); - if (child != null) + ItemsControl current = this; + foreach (var pathNode in pathNodes) { - current = child; - child.IsSubMenuOpen = true; + var child = await GetNavMenuItemContainerAsync(pathNode, current); + + if (child != null) + { + items.Add(child); + current = child; + child.IsMotionEnabled = false; + child.IsSubMenuOpen = true; + } } } + finally + { + foreach (var item in items) + { + item.IsMotionEnabled = true; + } + } + + return items; } private async Task GetNavMenuItemContainerAsync(ITreeNode childNode, ItemsControl current) @@ -533,7 +565,7 @@ public class NavMenu : NavMenuBase } else { - break; + break; } --cycleCount; } @@ -544,5 +576,6 @@ public class NavMenu : NavMenuBase { base.OnLoaded(e); ConfigureDefaultOpenedPaths(); + ConfigureDefaultSelectedPath(); } } \ No newline at end of file