用于应用侧边栏的树形导航菜单组件,对齐 Microsoft Fluent UI Blazor NavMenuTree 的结构与行为。
使用场景
- 应用侧边栏导航
- 多层级菜单结构
- 支持折叠与选中态
- 顶部过滤框(可选)
约束说明
SxNavMenu 的 ChildContent 建议只包含 SxNavMenuGroup / SxNavMenuLink。
IconName 使用当前项目字体图标名称(FontAwesome)。
Collapsed=true 时仅显示图标,不展示文本与分组展开按钮。
行为说明
SxNavMenu 提供容器、折叠与动作事件。
SxNavMenuGroup 支持折叠分组与嵌套。
SxNavMenuLink 提供链接导航与激活态。
ReNavigate=false 时,点击已激活项不会再次触发动作。
- 键盘:分组支持方向键展开/收起(左/右)与 Enter/Space 激活;完整 roving tabindex 尚未实现。
ShowIndentLine=true 时显示层级连线(浅色实线)。
- 一级节点悬停/选中为通栏高亮;子节点悬停为圆角矩形高亮。
折叠模式说明
- 折叠模式下,菜单变为窄条,仅显示图标。
- 折叠按钮默认为汉堡图标(三横线),位置可通过
ExpanderPosition 配置为顶部、底部或隐藏。
- 有子节点的菜单项在折叠模式下,图标右下角会显示小箭头指示器,便于区分。
- 折叠模式下悬停有子节点的菜单项,子项会以弹出菜单形式显示在侧面。
- 即使
ExpanderPosition=None(隐藏按钮),仍可通过 ExpandAsync() / CollapseAsync() / ToggleAsync() 方法编程控制。
过滤模式说明
ShowFilter=true 时在顶部显示过滤框,用于筛选当前树节点。
- 输入关键字后,仅显示匹配项;父级节点在匹配子节点时仍会显示。
- 过滤时分组自动展开,避免匹配项被折叠遮挡。
- 折叠模式下过滤入口以弹出输入框形式展示,过滤结果仍生效。
视觉规范
- 折叠模式下图标使用
SxButton(与侧边栏折叠按钮一致尺寸与样式)。
- 弹出菜单与窄条边缘保持最小间距,不压边线。
- 弹出菜单标题栏左右内边距使用标准 spacing token。
API
| 状态 |
参数名 |
标签 |
类型 |
默认值 |
描述 |
| ☑ |
ChildContent |
|
RenderFragment? |
null |
菜单内容。 |
| ☑ |
Collapsible |
|
bool |
false |
是否允许折叠。 |
| ☑ |
Collapsed |
|
bool |
false |
是否强制折叠。 |
| ☑ |
Expanded |
|
bool |
true |
是否展开。 |
| ☑ |
ExpandedChanged |
|
EventCallback<bool> |
- |
展开状态变化回调。 |
| ☑ |
InitiallyExpanded |
|
bool |
false |
初始展开状态。 |
| ☑ |
ReNavigate |
|
bool |
false |
是否允许重复导航。 |
| ☑ |
Width |
|
int? |
null |
展开时宽度(像素)。 |
| ☑ |
IndentWidth |
|
string? |
null |
子项缩进宽度(默认与图标槽宽度对齐,支持任意 CSS 长度值)。 |
| ☑ |
ShowIndentLine |
|
bool |
false |
是否显示层级连线。 |
| ☑ |
ExpanderContent |
|
RenderFragment? |
null |
折叠按钮自定义内容。 |
| ☑ |
ExpanderPosition |
|
NavMenuExpanderPosition |
Top |
折叠按钮位置(Top/Bottom/None)。 |
| ☑ |
CollapsedWidth |
|
string? |
null |
折叠时宽度(支持任意 CSS 长度值,如 48px、3rem);默认自动计算。 |
| ☑ |
ShowFilter |
|
bool |
true |
是否显示顶部过滤框。 |
| ☑ |
FilterPlaceholder |
|
string? |
null |
过滤框占位文本(en-US)。 |
| ☑ |
FilterPlaceholderZh |
|
string? |
null |
过滤框占位文本(zh-CN)。 |
| ☑ |
FilterAriaLabel |
|
string? |
null |
过滤框 aria-label(en-US)。 |
| ☑ |
FilterAriaLabelZh |
|
string? |
null |
过滤框 aria-label(zh-CN)。 |
| ☑ |
OnAction |
|
EventCallback<SxNavMenuActionArgs> |
- |
触发菜单动作时回调。 |
| ☑ |
Orientation |
|
Orientation |
Vertical |
菜单排列方向。 |
| ☑ |
Disabled |
Inherited |
bool |
false |
禁用状态。 |
| ☑ |
Loading |
Inherited |
bool |
false |
加载中状态。 |
| ☑ |
Id |
Inherited |
string? |
null |
组件的物理 Id。 |
| ☑ |
Class |
Inherited |
string? |
null |
自定义 CSS 类名。 |
| ☑ |
Style |
Inherited |
string? |
null |
自定义样式。 |
| ☑ |
Title |
Inherited |
string? |
null |
HTML title 属性。 |
| ☑ |
TabIndex |
Inherited |
int? |
null |
Tab 顺序索引。 |
| ☑ |
AccessKey |
Inherited |
string? |
null |
快捷键。 |
| ☑ |
AdditionalAttributes |
Inherited |
IEnumerable<KeyValuePair<string, object>>? |
null |
捕获不匹配的 HTML 属性。 |
| 状态 |
参数名 |
标签 |
类型 |
默认值 |
描述 |
| ☑ |
Text |
|
string? |
null |
组标题文本。 |
| ☑ |
Href |
|
string? |
null |
组标题链接。 |
| ☑ |
IconName |
|
string? |
null |
图标名称。 |
| ☑ |
IconStyle |
|
IconStyle |
Regular |
图标风格。 |
| ☑ |
Match |
|
NavLinkMatch |
Prefix |
路由匹配模式。 |
| ☑ |
Selected |
|
bool |
false |
选中状态。 |
| ☑ |
SelectedChanged |
|
EventCallback<bool> |
- |
选中状态变化回调。 |
| ☑ |
Expanded |
|
bool |
false |
是否展开。 |
| ☑ |
ExpandedChanged |
|
EventCallback<bool> |
- |
展开状态变化回调。 |
| ☑ |
InitiallyExpanded |
|
bool |
false |
初始展开状态。 |
| ☑ |
Collapsed |
|
bool |
false |
是否强制折叠。 |
| ☑ |
ShowIndentLine |
|
bool |
false |
是否显示层级连线。 |
| ☑ |
Width |
|
int? |
null |
项宽度(像素)。 |
| ☑ |
Value |
|
object? |
null |
自定义值。 |
| ☑ |
OnAction |
|
EventCallback<SxNavMenuActionArgs> |
- |
触发动作时回调。 |
| ☑ |
TabKey |
|
string? |
null |
Tab 标识(用于内部导航分组)。 |
| ☑ |
NavigationTarget |
|
SxNavMenuNavigationTarget |
Auto |
导航目标(内部 / 外部 / 新标签)。 |
| ☑ |
ChildContent |
|
RenderFragment? |
null |
子项内容。 |
| ☑ |
HeaderActions |
|
RenderFragment? |
null |
组头右侧动作区内容。 |
| ☑ |
Disabled |
Inherited |
bool |
false |
禁用状态。 |
| ☑ |
Loading |
Inherited |
bool |
false |
加载中状态。 |
| ☑ |
Id |
Inherited |
string? |
null |
组件的物理 Id。 |
| ☑ |
Class |
Inherited |
string? |
null |
自定义 CSS 类名。 |
| ☑ |
Style |
Inherited |
string? |
null |
自定义样式。 |
| ☑ |
Title |
Inherited |
string? |
null |
HTML title 属性。 |
| ☑ |
TabIndex |
Inherited |
int? |
null |
Tab 顺序索引。 |
| ☑ |
AccessKey |
Inherited |
string? |
null |
快捷键。 |
| ☑ |
AdditionalAttributes |
Inherited |
IEnumerable<KeyValuePair<string, object>>? |
null |
捕获不匹配的 HTML 属性。 |
| 状态 |
参数名 |
标签 |
类型 |
默认值 |
描述 |
| ☑ |
Text |
|
string? |
null |
链接文本。 |
| ☑ |
Href |
|
string? |
null |
导航链接。 |
| ☑ |
IconName |
|
string? |
null |
图标名称。 |
| ☑ |
IconStyle |
|
IconStyle |
Regular |
图标风格。 |
| ☑ |
Match |
|
NavLinkMatch |
Prefix |
路由匹配模式。 |
| ☑ |
Selected |
|
bool |
false |
选中状态。 |
| ☑ |
SelectedChanged |
|
EventCallback<bool> |
- |
选中状态变化回调。 |
| ☑ |
Width |
|
int? |
null |
项宽度(像素)。 |
| ☑ |
Value |
|
object? |
null |
自定义值。 |
| ☑ |
OnAction |
|
EventCallback<SxNavMenuActionArgs> |
- |
触发动作时回调。 |
| ☑ |
TabKey |
|
string? |
null |
Tab 标识(用于内部导航分组)。 |
| ☑ |
NavigationTarget |
|
SxNavMenuNavigationTarget |
Auto |
导航目标(内部 / 外部 / 新标签)。 |
| ☑ |
ChildContent |
|
RenderFragment? |
null |
子内容。 |
| ☑ |
Disabled |
Inherited |
bool |
false |
禁用状态。 |
| ☑ |
Loading |
Inherited |
bool |
false |
加载中状态。 |
| ☑ |
ShowIndentLine |
|
bool |
false |
是否显示层级连线。 |
| ☑ |
Id |
Inherited |
string? |
null |
组件的物理 Id。 |
| ☑ |
Class |
Inherited |
string? |
null |
自定义 CSS 类名。 |
| ☑ |
Style |
Inherited |
string? |
null |
自定义样式。 |
| ☑ |
Title |
Inherited |
string? |
null |
HTML title 属性。 |
| ☑ |
TabIndex |
Inherited |
int? |
null |
Tab 顺序索引。 |
| ☑ |
AccessKey |
Inherited |
string? |
null |
快捷键。 |
| ☑ |
AdditionalAttributes |
Inherited |
IEnumerable<KeyValuePair<string, object>>? |
null |
捕获不匹配的 HTML 属性。 |
Events
| 状态 |
事件名 |
类型 |
描述 |
| ☑ |
OnAction |
EventCallback<SxNavMenuActionArgs> |
菜单项触发动作回调。 |
| ☑ |
ExpandedChanged |
EventCallback<bool> |
展开状态变化回调。 |
| ☑ |
SelectedChanged |
EventCallback<bool> |
选中状态变化回调(Group/Link)。 |
| 方法名 |
返回类型 |
描述 |
ExpandAsync() |
Task |
展开菜单(编程控制)。 |
CollapseAsync() |
Task |
收起菜单(编程控制)。 |
ToggleAsync() |
Task |
切换展开/收起状态(编程控制)。 |
| 字段 |
类型 |
描述 |
ItemKind |
SxNavMenuItemKind |
当前触发项类型(Link/Group)。 |
ItemId |
string? |
触发项 Id。 |
Text |
string? |
文本。 |
Href |
string? |
链接地址。 |
Value |
object? |
透传值。 |
Selected |
bool |
当前选中态。 |
TabKey |
string? |
Tab 标识。 |
Target |
SxNavMenuNavigationTarget |
导航目标。 |
兼容说明
SxNavMenuItem 作为兼容包装存在,建议新代码使用 SxNavMenuLink。
示例
<SxNavMenu Collapsible="true">
<SxNavMenuGroup Text="应用" IconName="layer-group" InitiallyExpanded="true">
<SxNavMenuLink Text="首页" IconName="house" Href="/" />
<SxNavMenuLink Text="仪表盘" IconName="gauge" Href="/dashboard" />
</SxNavMenuGroup>
<SxNavMenuGroup Text="支持" IconName="circle-question">
<SxNavMenuLink Text="设置" IconName="gear" Href="/settings" />
</SxNavMenuGroup>
</SxNavMenu>
参考设计 (References)