WPF控件(12)
2023-06-13 18:24:05 211浏览
Menu:表示一个 Windows 菜单控件,该控件可用于按层次组织与命令和事件处理程序关联的元素。
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>


图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所示:

图3
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论
您可能感兴趣的博客
