2021-08-23 WPF控件专题 Menu控件详解

港控/mmm° 2022-09-07 09:53 559阅读 0赞

在这里插入图片描述

一:静态菜单

1.Menu控件介绍

Menu简介:Windows菜单控件,控件可用于按层次组织与命令和事件处理程序关联的元素
MenuBase:选择项的 — ItemsControl 条目控件

常用属性: IsMainMenu 是否接收主菜单激活通知 true 按alt或f10 激活,如果为false ,不能激活

MenuItem介绍 Menu控件中的可选项 带标题的条目控件

父类:HeaderedItemsControl

Command CommandParameter Icon Header
InputGestureText 快捷键文本

Click事件 Command命令

控件使用(制作一个菜单栏)

2.具体案例

  1. <Window x:Class="WpfAppTest.MenuWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:WpfAppTest"
  7. mc:Ignorable="d"
  8. Title="MenuWindow" Height="450" Width="800">
  9. <Window.Resources>
  10. <!--定义命令-->
  11. <RoutedUICommand x:Key="cmdRole" />
  12. <RoutedUICommand x:Key="cmdUser" />
  13. </Window.Resources>
  14. <!--输入绑定 Key Mouse-->
  15. <Window.InputBindings>
  16. <KeyBinding Command="{StaticResource cmdRole}" Gesture="Ctrl+R" />
  17. </Window.InputBindings>
  18. <!--将命令与处理程序关联起来-->
  19. <Window.CommandBindings>
  20. <CommandBinding Command="{StaticResource cmdRole}" Executed="MiRole_Click"/>
  21. <CommandBinding Command="{StaticResource cmdUser}" Executed="MiUser_Click"/>
  22. </Window.CommandBindings>
  23. <Grid>
  24. <Menu Height="30" VerticalAlignment="Top" IsMainMenu="False" >
  25. <MenuItem Header="系统管理">
  26. <!--<MenuItem Name="miRole" Header="角色管理" Click="MiRole_Click"/>-->
  27. <MenuItem Name="miRole" Header="角色管理" Command="{StaticResource cmdRole}" InputGestureText="Ctrl+R">
  28. <!--设置图标-->
  29. <MenuItem.Icon>
  30. <Image Source="imgs/1111.jpg"/>
  31. </MenuItem.Icon>
  32. </MenuItem>
  33. <MenuItem Header="用户管理" Command="{StaticResource cmdUser}"/>
  34. <MenuItem Header="菜单管理"/>
  35. <MenuItem Header="权限管理"/>
  36. </MenuItem>
  37. <MenuItem Header="基础资料">
  38. <MenuItem Header="商品管理">
  39. <MenuItem Header="商品类别管理"/>
  40. <MenuItem Header="商品信息管理"/>
  41. </MenuItem>
  42. <MenuItem Header="仓库管理"/>
  43. <MenuItem Header="单位管理"/>
  44. <MenuItem Header="期初入库设置"/>
  45. </MenuItem>
  46. <MenuItem Header="业务管理">
  47. <MenuItem Header="采购入库"/>
  48. <MenuItem Header="销售出库"/>
  49. </MenuItem>
  50. <MenuItem Header="查询中心">
  51. <MenuItem Header="采购查询">
  52. <MenuItem Header="按供应商采购统计"/>
  53. <MenuItem Header="按仓库采购统计"/>
  54. <MenuItem Header="按商品采购统计"/>
  55. </MenuItem>
  56. <MenuItem Header="销售查询"/>
  57. <MenuItem Header="库存查询"/>
  58. <MenuItem Header="单据查询"/>
  59. </MenuItem>
  60. </Menu>
  61. </Grid>
  62. </Window>
  63. /// <summary>
  64. /// 打开角色管理页面
  65. /// </summary>
  66. /// <param name="sender"></param>
  67. /// <param name="e"></param>
  68. private void MiRole_Click(object sender, RoutedEventArgs e)
  69. {
  70. RoleWindow roleWin = new RoleWindow();
  71. roleWin.Show();
  72. }
  73. private void MiUser_Click(object sender, RoutedEventArgs e)
  74. {
  75. UserManageWindow userWin = new UserManageWindow();
  76. userWin.Show();
  77. }

二:动态菜单

1.Menu控件介绍

动态生成菜单项 :递归加载菜单数据、分层数据模板

获取菜单数据:按层次结构组织的数据列表

菜单模型:编号 名称 父菜单编号 快捷键

菜单项模型:编号 名称 快捷键 子菜单列表

数据模板:分层数据模板 HeaderedItemsControl Menu TreeView

递归加载菜单的方法,分层数据模板嵌入Menu控件中

效果:菜单栏,菜单项动态加载生成的

2.具体案例

  1. <Window x:Class="WpfAppTest.MenuWindow1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:WpfAppTest"
  7. xmlns:model="clr-namespace:WpfAppTest.Models"
  8. mc:Ignorable="d"
  9. Title="MenuWindow1" Height="450" Width="800" Loaded="Window_Loaded">
  10. <Grid>
  11. <Menu HorizontalAlignment="Left" Height="30" Margin="0" VerticalAlignment="Top" BorderBrush="LightBlue" BorderThickness="1" ItemsSource="{Binding MenuList}">
  12. <Menu.ItemContainerStyle>
  13. <Style TargetType="{x:Type MenuItem}">
  14. <Setter Property="InputGestureText" Value="{Binding MKey}"/>
  15. <Setter Property="Command" Value="{Binding MICommand}"/>
  16. </Style>
  17. </Menu.ItemContainerStyle>
  18. <Menu.ItemTemplate>
  19. <HierarchicalDataTemplate DataType="{x:Type model:MenuItemModel}" ItemsSource="{Binding SubItems}">
  20. <TextBlock Text="{Binding MenuName}" VerticalAlignment="Center"/>
  21. </HierarchicalDataTemplate>
  22. </Menu.ItemTemplate>
  23. </Menu>
  24. </Grid>
  25. </Window>
  26. /// <summary>
  27. /// MenuWindow1.xaml 的交互逻辑
  28. /// </summary>
  29. public partial class MenuWindow1 : Window
  30. {
  31. public MenuWindow1()
  32. {
  33. InitializeComponent();
  34. }
  35. private void Window_Loaded(object sender, RoutedEventArgs e)
  36. {
  37. List<MenuInfo> allMenus = GetMenuList();//基础菜单数据
  38. List<MenuItemModel> menuList = new List<MenuItemModel>();//目标菜单数据
  39. AddAllMenus(allMenus, menuList, null, 0);
  40. VMenuModel vmodel = new VMenuModel();
  41. vmodel.MenuList = menuList;
  42. this.DataContext = vmodel;//当前Window的数据上下文
  43. }
  44. /// <summary>
  45. /// 递归加载菜单项数据
  46. /// </summary>
  47. /// <param name="allMenus"></param>
  48. /// <param name="menusList"></param>
  49. /// <param name="pMenu"></param>
  50. /// <param name="parentId"></param>
  51. private void AddAllMenus(List<MenuInfo> allMenus,List<MenuItemModel> menusList,MenuItemModel pMenu,int parentId)
  52. {
  53. var subList = allMenus.Where(m => m.ParentId == parentId);
  54. foreach(var mi in subList)
  55. {
  56. MenuItemModel miInfo = new MenuItemModel();
  57. miInfo.MenuId = mi.MenuId;
  58. miInfo.MenuName = mi.MenuName;
  59. miInfo.MKey = mi.MKey;
  60. if (pMenu != null)
  61. pMenu.SubItems.Add(miInfo);
  62. else
  63. menusList.Add(miInfo);
  64. AddAllMenus(allMenus, menusList, miInfo, mi.MenuId);
  65. }
  66. }
  67. /// <summary>
  68. /// 获取菜单数据
  69. /// </summary>
  70. /// <returns></returns>
  71. private List<MenuInfo> GetMenuList()
  72. {
  73. string sql = "select MenuId,MenuName,ParentId,MKey from MenuInfos";
  74. SqlDataReader dr = SqlHelper.ExecuteReader(sql, 1);
  75. List<MenuInfo> list = new List<MenuInfo>();
  76. while (dr.Read())
  77. {
  78. MenuInfo menu = new MenuInfo();
  79. menu.MenuId = (int)dr["MenuId"];
  80. menu.MenuName = dr["MenuName"].ToString();
  81. menu.ParentId = (int)dr["ParentId"];
  82. menu.MKey = dr["MKey"].ToString();
  83. list.Add(menu);
  84. }
  85. dr.Close();
  86. return list;
  87. }
  88. }
  89. public class VMenuModel
  90. {
  91. /// <summary>
  92. /// Menu控件的数据源属性
  93. /// </summary>
  94. public List<MenuItemModel> MenuList { get; set; }
  95. }
  96. public class MenuInfo
  97. {
  98. public int MenuId { get; set; }
  99. public string MenuName { get; set; }
  100. public int ParentId { get; set; }
  101. public string MKey { get; set; }
  102. }
  103. //菜单项绑定实体
  104. public class MenuItemModel
  105. {
  106. public int MenuId { get; set; }
  107. public string MenuName { get; set; }
  108. public string MKey { get; set; }
  109. public List<MenuItemModel> SubItems { get; set; }
  110. public MenuItemModel()
  111. {
  112. SubItems = new List<MenuItemModel>();
  113. }
  114. public ICommand MICommand
  115. {
  116. get
  117. {
  118. return new RelayCommand(o =>
  119. {
  120. MessageBox.Show(MenuName);
  121. });
  122. }
  123. }
  124. }

发表评论

表情:
评论列表 (有 0 条评论,559人围观)

还没有评论,来说两句吧...

相关阅读