WPF控件(12)

奋斗吧
奋斗吧
擅长邻域:未填写

标签: WPF控件(12) 博客 51CTO博客

2023-06-13 18:24:05 210浏览

WPF控件(12),Menu:表示一个Windows菜单控件,该控件可用于按层次组织与命令和事件处理程序关联的元素。命名空间:System.Windows.Controls1、直接在窗体中添加菜单如代码1所示,在XAML中使用MenuItem添加主菜单和子菜单,可使用InputGestureText设置快捷键。运行结果如图1和图2所示。代码1:<Window.Resources>

Menu:表示一个 Windows 菜单控件,该控件可用于按层次组织与命令和事件处理程序关联的元素。

命名空间:System.Windows.Controls

1、直接在窗体中添加菜单

如代码1所示,在XAML中使用 MenuItem 添加主菜单和子菜单,可使用 InputGestureText 设置快捷键。运行结果如图1和图2所示。

代码1:

<Window.Resources>
        <Style x:Key="myMenu" TargetType="Menu">
            <Setter Property="FontSize" Value="18"></Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Menu Style="{StaticResource myMenu}" VerticalAlignment="Top" Height="30" Background="Bisque">
            <MenuItem Header="菜单1">
                <MenuItem Header="菜单1-1"></MenuItem>
                <MenuItem Header="菜单1-2"></MenuItem>
                <MenuItem Header="菜单1-3"></MenuItem>
            </MenuItem>
            <MenuItem Header="菜单2">
                <MenuItem Header="菜单2-1" InputGestureText="Ctrl+1"></MenuItem>
                <MenuItem Header="菜单2-2" InputGestureText="Ctrl+2"></MenuItem>
                <MenuItem Header="菜单2-3" InputGestureText="Ctrl+3"></MenuItem>
            </MenuItem>
            <MenuItem Header="菜单3"></MenuItem>
        </Menu>
    </Grid>

WPF控件(12)_MenuWPF控件(12)_WPF_02

图1                                                                    图2


2、动态加载菜单

Menu 包含 ItemTemplate 属性,表示获取或设置用来显示每个项的 DataTemplate

HierarchicalDataTemplate:表示分层数据模板,一般用于MenuItem和TreeViewItem。

HierarchicalDataTemplate 包含 DataType 和 ItemsSource 两个属性。

DataType:获取或设置此 DataTemplate 所针对的类型。(即指定数据类型)

ItemsSource:获取或设置此数据模板的绑定,该绑定指示在何处可以找到表示数据层次结构中下一级别的集合。(即绑定数据子集)

代码1:创建 MenuInfo 类,代码1中MenuInfo()方法作用是将子菜单添加到父菜单下面。代码1中 if 语句代码表示:若父菜单不为空且子菜单不为空时,将子菜单放到父菜单下面。

代码1:

public class MenuInfo
    {
        public string MenuName { get; set; }
        public List<MenuInfo> SubMenu { get; set;}

        public MenuInfo(string menuName, MenuInfo parentMenu)
        {
            MenuName = menuName;
            if (parentMenu != null)
            {
                List<MenuInfo> lists = parentMenu.SubMenu ?? new List<MenuInfo>();
                lists.Add(this);
                parentMenu.SubMenu = lists;
            }
        }
    }

代码2:是创建Menuhelper 类,将菜单详细数据写在里面。其中m1、m2、m3为父菜单,m1_1、m1_2、m1_3、m1_4是 m1 的子菜单并将其添加到m1下面。

menu.Add(m1); 此句代码是将父菜单添加到菜单集合中。因为子菜单已经放到了父菜单下面,所以不需再将子菜单添加到菜单集合中。

代码2:

public class Menuhelper
    {
        public static List<MenuInfo> CreatMenu()
        {
            List<MenuInfo> menu = new List<MenuInfo>();

            MenuInfo m1 = new MenuInfo("文件", null);
            MenuInfo m2 = new MenuInfo("编辑", null);
            MenuInfo m3 = new MenuInfo("工具", null);

            MenuInfo m1_1 = new MenuInfo("打开", m1);
            MenuInfo m1_2 = new MenuInfo("新建", m1);
            MenuInfo m1_3 = new MenuInfo("保存", m1);
            MenuInfo m1_4 = new MenuInfo("设置", m1);

            menu.Add(m1);
            menu.Add(m2);
            menu.Add(m3);

            return menu;
        }
    }


代码3:xaml代码

<Window x:Class="WpfApp1.controls.Mennu2"
        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:WpfApp1.controls"
        xmlns:em="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="Mennu2" Height="300" Width="500" Loaded="Window_Loaded">
    <Grid>
        <Menu Name="menu2" VerticalAlignment="Top" Height="30" Background="Bisque" FontSize="18" ItemsSource="{Binding}">
            <Menu.ItemTemplate>
                <HierarchicalDataTemplate DataType="{x:Type em:MenuInfo}" ItemsSource="{Binding SubMenu}">
                    <TextBlock Text="{Binding MenuName}"></TextBlock>
                </HierarchicalDataTemplate>
            </Menu.ItemTemplate>
        </Menu>
    </Grid>
</Window>
xmlns:em="clr-namespace:WpfApp1"

此句代码中,em表示命名空间(MenuInfo类的命名空间)

<HierarchicalDataTemplate DataType="{x:Type em:MenuInfo}" ItemsSource="{Binding SubMenu}">

此句代码中,包含了 DataType 的用法,指定了em命名空间下的MenuInfo类型,ItemsSource="{Binding SubMenu}"绑定了子菜单,可以将子菜单循环加载出来。

<TextBlock Text="{Binding MenuName}"></TextBlock>此句代码是将菜单名称绑定到TextBlock的Text属性上。

代码4:在Window窗体中添加一个Loaded事件,设置menu2的数据上下文

代码4:

public void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.menu2.DataContext = Menuhelper.CreatMenu();
        }

程序运行结果如图3所示:

WPF控件(12)_WPF_03

图3

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695