WPF动态加载Menu菜单

2021-03-18 02:26

阅读:837

有一个项目动态加载wpf的菜单控件可以非常有效的做到更具用户权限显示或控制MenuItem菜单,如何实现这种功能,其实也非常简单。

  首先需要了解Wpf的menu菜单控件,她的结构其实也非常简单

  1.  
    Menu DockPanel.Dock="Top" Name="MenuOptionGroup">
  2.  
    MenuItem Header="菜单1">
  3.  
    MenuItem Header="内容1">
  4.  
     
  5.  
    MenuItem>
  6.  
     
  7.  
    MenuItem>
  8.  
    MenuItem Header="菜单2">
  9.  
     
  10.  
    MenuItem>
  11.  
    Menu>

  技术图片

这是其最基本的结构,menu是其菜单主体,menu下面有menuitem,menuitem可以无限的放入menuitem.

 

具体思路:

获取需要的显示菜单数据(数据需要拥有父id字段,就是这个menitem的上一级menuitem的id),通过先查询出menuitem数据的父id字段为0的menuitem的数据(就是menuitem没有上一级菜单的菜单项目)Add加载menuitem 到menu。然后继续拿到此的id来做查询出是否还有父id的数为此id的,如果有就继续下去,没有则给menuitem 注册一个click事件,用于点击菜单项目做相应的操作。

 

数据库表设计:

技术图片

 

具体实现方法:

  1.  
    public List menuItems = new List();
  2.  
    public MainIndex()
  3.  
    {
  4.  
    InitializeComponent();
  5.  
    SetMenus();
  6.  
    foreach (var item in menuItems)
  7.  
    {
  8.  
    MenuOptionGroup.Items.Add(item);
  9.  
    }
  10.  
    }
  11.  
    private void SetMenus()
  12.  
    {
  13.  
    List lstMenus = lstGblMenuItem.Where(t => t.PaterId == 0).ToList();
  14.  
    foreach (GblMenu item in lstMenus)
  15.  
    {
  16.  
    MenuItem menuItem = new MenuItem();
  17.  
    menuItem.Header = item.MenuName;
  18.  
    menuItem.Name = item.ItemName;
  19.  
    menuItem = SetMenuItems(menuItem, item.Id);
  20.  
    menuItems.Add(menuItem);
  21.  
    }
  22.  
    }
  23.  
    private MenuItem SetMenuItems(MenuItem menuItem, int PatId)
  24.  
    {
  25.  
    List lstMenuItems = lstGblMenuItem.Where(t => t.PaterId == PatId).ToList();
  26.  
    foreach (GblMenu item in lstMenuItems)
  27.  
    {
  28.  
    MenuItem menuItems = new MenuItem();
  29.  
    menuItems.Header = item.MenuName;
  30.  
    menuItems.Name = item.ItemName;
  31.  
     
  32.  
    menuItem.Items.Add(menuItems);
  33.  
    if (!lstGblMenuItem.Where(t => t.PaterId == item.Id).ToList().Any())
  34.  
    {
  35.  
    menuItems.Click += MenuItems_Click;
  36.  
    }
  37.  
    SetMenuItems(menuItems, item.Id);
  38.  
    }
  39.  
    return menuItem;
  40.  
    }

效果:

技术图片

 

结语:

其实这只是其中一个方法,且这种方法也适用与Winform,都是同一个套路。


评论


亲,登录后才可以留言!