首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【愚公系列】2023年09月 WPF控件专题 XAML介绍
2
【愚公系列】2023年09月 WPF控件专题 WPF应用程序组成
3
【愚公系列】2023年09月 WPF控件专题 Window窗体属性和事件
4
【愚公系列】2023年09月 WPF控件专题 Label、TextBox、PasswordBox控件介绍
5
【愚公系列】2023年09月 WPF控件专题 Button控件详解
6
【愚公系列】2023年09月 WPF控件专题 RadioButton控件详解
7
【愚公系列】2023年09月 WPF控件专题 CheckBox控件详解
8
【愚公系列】2023年09月 WPF控件专题 Image控件详解
9
【愚公系列】2023年09月 WPF控件专题 Border控件详解
10
【愚公系列】2023年09月 WPF控件专题 ComboBox控件详解
11
【愚公系列】2023年09月 WPF控件专题 ListBox控件详解
12
【愚公系列】2023年09月 WPF控件专题 DatePicker控件详解
13
【愚公系列】2023年09月 WPF控件专题 Calendar控件详解
14
【愚公系列】2023年09月 WPF控件专题 Slider控件详解
15
【愚公系列】2023年09月 WPF控件专题 ProgressBar控件详解
16
【愚公系列】2023年10月 WPF控件专题 StackPanel控件详解
17
【愚公系列】2023年10月 WPF控件专题 WrapPanel控件详解
18
【愚公系列】2023年10月 WPF控件专题 DockPanel控件详解
19
【愚公系列】2023年10月 WPF控件专题 Canvas控件详解
20
【愚公系列】2023年10月 WPF控件专题 Grid控件详解
21
【愚公系列】2023年10月 WPF控件专题 Groupbox控件详解
22
【愚公系列】2023年10月 WPF控件专题 Expander控件详解
23
【愚公系列】2023年10月 WPF控件专题 TabControl控件详解
24
【愚公系列】2023年10月 WPF控件专题 Frame控件详解
25
【愚公系列】2023年10月 WPF控件专题 ListView控件详解
26
【愚公系列】2023年10月 WPF控件专题 DataGrid控件详解
27
【愚公系列】2023年10月 WPF控件专题 Menu控件详解
28
【愚公系列】2023年10月 WPF控件专题 ContextMenu控件详解
29
【愚公系列】2023年10月 WPF控件专题 TreeView控件详解
30
【愚公系列】2023年10月 WPF控件专题 ToolBar控件详解
31
【愚公系列】2023年10月 WPF控件专题 ToolBarTray控件详解
32
【愚公系列】2023年10月 WPF控件专题 StatusBar控件详解
33
【愚公系列】2023年11月 WPF控件专题 MediaElement控件详解
34
【愚公系列】2023年11月 WPF控件专题 RichTextBox控件详解
35
【愚公系列】2023年11月 WPF控件专题 GridView控件详解
36
【愚公系列】2023年11月 WPF控件专题 Rectangle控件详解
37
【愚公系列】2023年11月 WPF控件专题 Popup控件详解
38
【愚公系列】2023年11月 WPF控件专题 OpenFileDialog控件详解
39
【愚公系列】2023年11月 WPF控件专题 SaveFileDialog控件详解
40
【愚公系列】2023年11月 WPF控件专题 RepeatButton控件详解
41
【愚公系列】2023年11月 WPF控件专题 Ellipse控件详解
42
【愚公系列】2023年11月 WPF控件专题 Polygon控件详解
43
【愚公系列】2023年11月 WPF控件专题 Path控件详解
44
【愚公系列】2023年11月 WPF控件专题 WindowFormsHost控件详解
45
【愚公系列】2023年11月 WPF控件专题 WebBrowser控件详解
46
【愚公系列】2023年11月 WPF控件专题 Validation控件详解
47
【愚公系列】2023年11月 WPF控件专题 Page控件详解
48
【愚公系列】2023年11月 WPF控件专题 PrintDialog控件详解
49
【愚公系列】2023年11月 WPF控件专题 Track控件详解
50
【愚公系列】2023年11月 WPF控件专题 Polyline控件详解

【愚公系列】2023年10月 WPF控件专题 Menu控件详解

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。

🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。

🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。

原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。

自定义控件则允许开发人员使用XAML和C#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。

🚀一、Menu控件详解

WPF中的Menu控件用于显示应用程序的菜单栏。Menu控件通常用于顶层窗口或主窗口中,以提供应用程序功能的导航。Menu控件的常见用法是在菜单中定义菜单项,然后关联菜单项和命令,使用户能够通过单击菜单项来执行命令。

以下是一些Menu控件的属性:

  • Items:MenuItems的集合,控制菜单的内容。
  • IsMainMenu:指定是否应将菜单作为应用程序的主菜单。
  • Visibility:指定是否应显示菜单。默认为Visible。

以下是一个简单的Menu控件示例:

代码语言:html
复制
<Menu IsMainMenu="True">
  <MenuItem Header="_File">
    <MenuItem Header="_New"/>
    <MenuItem Header="_Open"/>
    <MenuItem Header="_Save"/>
    <MenuItem Header="_Exit"/>
  </MenuItem>
  <MenuItem Header="_Edit">
    <MenuItem Header="_Cut"/>
    <MenuItem Header="_Copy"/>
    <MenuItem Header="_Paste"/>
  </MenuItem>
  <MenuItem Header="_Help">
    <MenuItem Header="_About"/>
  </MenuItem>
</Menu>

此示例包含三个菜单项:文件、编辑和帮助。每个菜单项都包含一个或多个子菜单项,用于执行操作或导航到其他部分。用户可以通过单击菜单项来打开子菜单或执行操作。

🔎1.属性介绍

WPF中Menu控件的属性包括:

  1. IsMainMenu:指示当前Menu控件是否是应用程序的主菜单。
  2. IsCheckable:指示是否可以勾选Menu项。
  3. IsCheckable:指示当前Menu项是否被勾选。
  4. IsSubmenuOpen:指示当前Menu项是否打开了子菜单。
  5. InputGestureText:表示与菜单项关联的按键组合。
  6. Command:表示与菜单项关联的命令。
  7. ItemsSource:表示Menu项的数据源。
  8. ItemContainerStyle:表示Menu项的样式。
  9. ItemTemplate:表示Menu项的模板。
  10. Orientation:表示Menu项的排列方式,水平或垂直。

🔎2.常用场景

WPF中Menu控件常用于实现应用程序的菜单功能。以下是一些常见的场景:

  1. 顶部菜单栏:在应用程序窗口的顶部放置一个菜单栏,用户可以点击菜单项打开不同的窗口或执行不同的操作。
  2. 上下文菜单:当用户右键单击某个控件时,弹出该控件的上下文菜单,用户可以从菜单中选择不同的操作。
  3. 快捷键菜单:为了提高应用程序的操作效率,可以为菜单项设置快捷键,让用户通过键盘快速执行相应的操作。
  4. 动态菜单:根据用户的不同权限或当前的系统状态,动态地生成菜单项,让用户只能看到自己有权限或当前可执行的操作。
  5. ToolBar菜单:在工具栏上放置一些常用的操作,用户可以通过点击相关的按钮快速执行相应的操作。

Menu控件是实现应用程序菜单功能的重要控件,可以提高应用程序的易用性和操作效率。

🔎3.具体案例

🦋3.1 静态菜单

代码语言:javascript
复制
<Window x:Class="WpfAppTest.MenuWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAppTest"
        mc:Ignorable="d"
        Title="MenuWindow" Height="450" Width="800">
        <Window.Resources>
                <!--定义命令-->
                <RoutedUICommand x:Key="cmdRole" />
                <RoutedUICommand x:Key="cmdUser" />
        </Window.Resources>
        <!--输入绑定  Key   Mouse-->
        <Window.InputBindings>
                <KeyBinding Command="{StaticResource cmdRole}" Gesture="Ctrl+R" />
        </Window.InputBindings>
        <!--将命令与处理程序关联起来-->
        <Window.CommandBindings>
                <CommandBinding Command="{StaticResource cmdRole}" Executed="MiRole_Click"/>
                <CommandBinding Command="{StaticResource cmdUser}" Executed="MiUser_Click"/>
        </Window.CommandBindings>
    <Grid>
                <Menu Height="30" VerticalAlignment="Top" IsMainMenu="False" >
                        <MenuItem Header="系统管理">
                                <!--<MenuItem Name="miRole" Header="角色管理" Click="MiRole_Click"/>-->
                                <MenuItem Name="miRole" Header="角色管理" Command="{StaticResource cmdRole}" InputGestureText="Ctrl+R">
                                        <!--设置图标-->
                                        <MenuItem.Icon>
                                                <Image Source="imgs/1111.jpg"/>
                                        </MenuItem.Icon>
                                </MenuItem>
                                <MenuItem Header="用户管理" Command="{StaticResource cmdUser}"/>
                                <MenuItem Header="菜单管理"/>
                                <MenuItem Header="权限管理"/>
                        </MenuItem>
                        <MenuItem Header="基础资料">
                                <MenuItem Header="商品管理">
                                        <MenuItem Header="商品类别管理"/>
                                        <MenuItem Header="商品信息管理"/>
                                </MenuItem>
                                <MenuItem Header="仓库管理"/>
                                <MenuItem Header="单位管理"/>
                                <MenuItem Header="期初入库设置"/>
                        </MenuItem>
                        <MenuItem Header="业务管理">
                                <MenuItem Header="采购入库"/>
                                <MenuItem Header="销售出库"/>
                        </MenuItem>
                        <MenuItem Header="查询中心">
                                <MenuItem Header="采购查询">
                                        <MenuItem Header="按供应商采购统计"/>
                                        <MenuItem Header="按仓库采购统计"/>
                                        <MenuItem Header="按商品采购统计"/>
                                </MenuItem>
                                <MenuItem Header="销售查询"/>
                                <MenuItem Header="库存查询"/>
                                <MenuItem Header="单据查询"/>
                        </MenuItem>
                </Menu>
    </Grid>
</Window>
代码语言:javascript
复制
/// <summary>
/// 打开角色管理页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MiRole_Click(object sender, RoutedEventArgs e)
{
        RoleWindow roleWin = new RoleWindow();
        roleWin.Show();
}

private void MiUser_Click(object sender, RoutedEventArgs e)
{
        UserManageWindow userWin = new UserManageWindow();
        userWin.Show();
}

🦋3.2 动态菜单

代码语言:javascript
复制
<Window x:Class="WpfAppTest.MenuWindow1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfAppTest"
        xmlns:model="clr-namespace:WpfAppTest.Models"
        mc:Ignorable="d"
        Title="MenuWindow1" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
                <Menu HorizontalAlignment="Left" Height="30" Margin="0" VerticalAlignment="Top" BorderBrush="LightBlue" BorderThickness="1"  ItemsSource="{Binding MenuList}">
                        <Menu.ItemContainerStyle>
                                <Style TargetType="{x:Type MenuItem}">
                                        <Setter Property="InputGestureText" Value="{Binding MKey}"/>
                                        <Setter Property="Command" Value="{Binding MICommand}"/>
                                </Style>
                        </Menu.ItemContainerStyle>
                        <Menu.ItemTemplate>
                                <HierarchicalDataTemplate DataType="{x:Type model:MenuItemModel}" ItemsSource="{Binding SubItems}">
                                        <TextBlock Text="{Binding MenuName}" VerticalAlignment="Center"/>
                                </HierarchicalDataTemplate>
                        </Menu.ItemTemplate>
                     
                </Menu>

        </Grid>
</Window>
代码语言:javascript
复制
/// <summary>
/// MenuWindow1.xaml 的交互逻辑
/// </summary>
public partial class MenuWindow1 : Window
{
        public MenuWindow1()
        {
                InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
                List<MenuInfo> allMenus = GetMenuList();//基础菜单数据
                List<MenuItemModel> menuList = new List<MenuItemModel>();//目标菜单数据
                AddAllMenus(allMenus, menuList, null, 0);
                VMenuModel vmodel = new VMenuModel();
                vmodel.MenuList = menuList;
                this.DataContext = vmodel;//当前Window的数据上下文
        }


        /// <summary>
        /// 递归加载菜单项数据
        /// </summary>
        /// <param name="allMenus"></param>
        /// <param name="menusList"></param>
        /// <param name="pMenu"></param>
        /// <param name="parentId"></param>
        private void AddAllMenus(List<MenuInfo> allMenus,List<MenuItemModel> menusList,MenuItemModel pMenu,int parentId)
        {
                var subList = allMenus.Where(m => m.ParentId == parentId);
                foreach(var mi in subList)
                {
                        MenuItemModel miInfo = new MenuItemModel();
                        miInfo.MenuId = mi.MenuId;
                        miInfo.MenuName = mi.MenuName;
                        miInfo.MKey = mi.MKey;
                        if (pMenu != null)
                                pMenu.SubItems.Add(miInfo);
                        else
                                menusList.Add(miInfo);
                        AddAllMenus(allMenus, menusList, miInfo, mi.MenuId);
                }
        }

        /// <summary>
        /// 获取菜单数据
        /// </summary>
        /// <returns></returns>
        private List<MenuInfo> GetMenuList()
        {
                string sql = "select MenuId,MenuName,ParentId,MKey from MenuInfos";
                SqlDataReader dr = SqlHelper.ExecuteReader(sql, 1);
                List<MenuInfo> list = new List<MenuInfo>();
                while (dr.Read())
                {
                        MenuInfo menu = new MenuInfo();
                        menu.MenuId = (int)dr["MenuId"];
                        menu.MenuName = dr["MenuName"].ToString();
                        menu.ParentId = (int)dr["ParentId"];
                        menu.MKey = dr["MKey"].ToString();
                        list.Add(menu);
                }
                dr.Close();
                return list;
        }
}

public class VMenuModel
{
        /// <summary>
        /// Menu控件的数据源属性
        /// </summary>
        public List<MenuItemModel> MenuList { get; set; }
}

public class MenuInfo
{
    public int MenuId { get; set; }
    public string MenuName { get; set; }
    public int ParentId { get; set; }
    public string MKey { get; set; }
}


//菜单项绑定实体
public class MenuItemModel
{
        public int MenuId { get; set; }
        public string MenuName { get; set; }
        public string MKey { get; set; }

        public List<MenuItemModel> SubItems { get; set; }
        public MenuItemModel()
        {
                SubItems = new List<MenuItemModel>();
        }
        public ICommand MICommand
        {
                get
                {
                        return new RelayCommand(o =>
                        {
                                MessageBox.Show(MenuName);
                        });
                }
        }
}

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

下一篇
举报
领券