WPF动态加载Menu菜单控件

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

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

<Menu DockPanel.Dock="Top" Name="MenuOptionGroup">
    <MenuItem Header="菜单1">
        <MenuItem Header="内容1">
                
        </MenuItem>                
                    
    </MenuItem>    
    <MenuItem Header="菜单2">       
                    
    </MenuItem>            
 </Menu>

  

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

 

具体思路:

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

 

数据库表设计:

 

具体实现方法:

public List<MenuItem> menuItems = new List<MenuItem>();
public MainIndex()
        {
            InitializeComponent();
            SetMenus();
            foreach (var item in menuItems)
            {
                MenuOptionGroup.Items.Add(item);
            }
        }
private void SetMenus()
        {
            List<GblMenu> lstMenus = lstGblMenuItem.Where(t => t.PaterId == 0).ToList();
            foreach (GblMenu item in lstMenus)
            {
                MenuItem menuItem = new MenuItem();
                menuItem.Header = item.MenuName;
                menuItem.Name = item.ItemName;
                menuItem = SetMenuItems(menuItem, item.Id);
                menuItems.Add(menuItem);
            }
        }
        private MenuItem SetMenuItems(MenuItem menuItem, int PatId)
        {
            List<GblMenu> lstMenuItems = lstGblMenuItem.Where(t => t.PaterId == PatId).ToList();
            foreach (GblMenu item in lstMenuItems)
            {
                MenuItem menuItems = new MenuItem();
                menuItems.Header = item.MenuName;
                menuItems.Name = item.ItemName;

                menuItem.Items.Add(menuItems);
                if (!lstGblMenuItem.Where(t => t.PaterId == item.Id).ToList().Any())
                {
                    menuItems.Click += MenuItems_Click;
                }
                SetMenuItems(menuItems, item.Id);
            }
            return menuItem;
        }

效果:

 

结语:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值