有一个项目动态加载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.这样就好了实现动态加载menuitem了。
具体思路:
获取需要的显示菜单数据(数据需要拥有父id字段,就是这个menitem的上一级menuitem的id),通过先查询出menuitem数据的父id字段为0的menuitem的数据(就是menuitem没有上一级菜单的菜单项目)Add加载menuitem 到menu。然后继续拿到此的id来做查询出是否还有父id的数为此id的,如果有就继续下去,没有则给menuitem 注册一个click事件,用于点击菜单项目做相应的操作。
数据库表设计:
具体实现方法:
public List<MenuItem> menuItems = newList<MenuItem>();
publicMainIndex()
{
InitializeComponent();
SetMenus();
foreach (var item in menuItems)
{
MenuOptionGroup.Items.Add(item);
}
}
privatevoid 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,都是同一个套路。
首先需要了解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.这样就好了实现动态加载menuitem了。
具体思路:
获取需要的显示菜单数据(数据需要拥有父id字段,就是这个menitem的上一级menuitem的id),通过先查询出menuitem数据的父id字段为0的menuitem的数据(就是menuitem没有上一级菜单的菜单项目)Add加载menuitem 到menu。然后继续拿到此的id来做查询出是否还有父id的数为此id的,如果有就继续下去,没有则给menuitem 注册一个click事件,用于点击菜单项目做相应的操作。
数据库表设计:
具体实现方法:
public List<MenuItem> menuItems = newList<MenuItem>();
publicMainIndex()
{
InitializeComponent();
SetMenus();
foreach (var item in menuItems)
{
MenuOptionGroup.Items.Add(item);
}
}
privatevoid 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,都是同一个套路。