Blazor学习之路-20260108动态菜单

选一个Blazor的成熟的UI库,在MudBlazor和BootstrapBlazor 两个之间不能确定。

由于之前做WPF都是用MaterialDesign库,暂定MudBlazor吧。

简单感觉下MudBlazor的库,MudBlazor.dll文件有9M大,如果WebAssembly在前端加载,需要下载dll时,可能需要一些加载时间。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

通过默认的vs样板创建Mud工程,默认只包含三个菜单。

将来系统菜单希望是能配置的。因此简单对NavMenu做了处理。暂时自定义菜单,将来实现通过配置文件或者数据库加载菜单。

 1 <MudNavMenu>
 2     @foreach(var item in MenuItems)
 3     {
 4         if(item.SubItems == null )
 5         {
 6             <MudNavLink Href="@item.Href" Match="@item.Match" Icon="@item.Icon" >@item.Title</MudNavLink>
 7         }
 8         else
 9         {
10             <MudNavGroup 
11                 Title="@item.Title"
12                 Icon="@item.Icon"
13                 Expanded="@item.Expanded">
14                 
15                 @foreach (var subItem in item.SubItems)
16                 {
17                     <MudNavLink Href="@subItem.Href" Match="@subItem.Match" Icon="@subItem.Icon">@subItem.Title</MudNavLink>
18                 }
19                 </MudNavGroup>
20         }
21     }
22 
23 </MudNavMenu>
public class NavMenuItem
{
    public NavLinkMatch Match { get; set; } = NavLinkMatch.All;
    public string Href { get; set; } = "/";
    public string Title { get; set; } = string.Empty;
    public string Icon { get; set; } = string.Empty;
    public bool Expanded { get; set; } = true;
    public List<string> Roles { get; set; } = [];
    public List<NavMenuItem>? SubItems { get; set; } = null;
}


public partial class NavMenu
{
    private List<NavMenuItem> MenuItems { get; set; } = [];

    protected override Task OnInitializedAsync()
    {
        // 2026-1-8 完成菜单的自定义加载,通过配置文件或者数据库读取
        // 同时配合修改NavMenu.razor
        // 再加上权限设置
        // 参考 https://blog.csdn.net/gitblog_01027/article/details/151278567
        MenuItems =
        [
            new()
            {   Href = "/",
                Match = NavLinkMatch.All,
                Icon = Icons.Material.Filled.Dashboard,
                Title = "主页"
            },
            new()
            {
                Href = "counter",
                Match = NavLinkMatch.Prefix,
                Icon = Icons.Material.Filled.Calculate,
                Title = "计数器"
            },
             new()
            {
                Href = "weather",
                Match = NavLinkMatch.Prefix,
                Icon = Icons.Material.Filled.WbSunny,
                Title = "天气"
            },
              new()
              {
                  Href = "",
                  Match = NavLinkMatch.Prefix,
                  Icon = Icons.Material.Filled.Settings,
                  Title = "Settings",
                  Expanded = false,
                  SubItems =
                  [
                      new NavMenuItem()
                      {
                          Href = "counter",
                          Match = NavLinkMatch.Prefix,
                          Icon = Icons.Material.Filled.Person,
                          Title = "Users"
                      },
                    new NavMenuItem()
                    {
                        Href = "settings/security",
                        Match = NavLinkMatch.Prefix,
                        Icon = Icons.Material.Filled.Security,
                        Title = "Security"
                    }
                ]
              }
        ];


        return base.OnInitializedAsync();
    }
}

  

 

posted @ 2026-01-08 11:55  wangzhefeng  阅读(8)  评论(0)    收藏  举报