WPF右键菜单的子菜单

10

如果上下文菜单在xaml中是"硬编码"的,那么添加子菜单会很容易。例如:

<ContextMenu>
    <MenuItem Header="Comm1" Command="{Binding Blabla1}">
        <MenuItem Header="SubComm1" Command="{Binding Blabla2}"></MenuItem>
    </MenuItem>
    <MenuItem Command="Comm2"></MenuItem>
    <MenuItem Command="Comm3"></MenuItem>
</ContextMenu>
这意味着ContextMenu有三个元素(Comm1、Comm2和Comm3),而Comm1有子菜单SubComm1。
我让我的上下文菜单变得更加灵活:
<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter>
            <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter>
        </Style>
     </ContextMenu.ItemContainerStyle>
</ContextMenu>

基本上,我可以在ContextMenu中拥有任意数量的元素,并且任何元素都可以具有任何命令。我如何向ContextMenu元素添加子菜单?


将您的树形数据结构绑定到ItemsSource,并使用转换器将数据转换为MenuItems。 - ninja hedgehog
3个回答

15

您可以将MenuItem.ItemsSource设置为嵌套的集合。这将为任何菜单项生成子菜单。为此,支持 MenuItem 的模型应该在其内部具有 submenuitems 集合

<ContextMenu ItemsSource="{Binding ContextMenuItemsSource}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="ItemsSource" Value="{Binding ContextMenuSubItems}"></Setter>
            <Setter Property="Header" Value="{Binding ContextMenuCommandHeader}"></Setter>
            <Setter Property="Command" Value="{Binding ContextMenuCommand}"></Setter>
        </Style>
     </ContextMenu.ItemContainerStyle>
</ContextMenu>

同样地,您可以设置MenuItem.ItemContainerStyleMenuItem.ItemTemplate来为您的子菜单项设置样式。


2

明确说明,如果不绑定集合,您可以通过嵌套子菜单来添加子菜单。

一个 MenuItem 可以包含其他 MenuItem 元素作为子/下级菜单,并且可以达到多个层级。以下代码将三个子菜单项添加到第一个菜单项中。

<MenuItem Header="_File">  
   <MenuItem Header="_Open" IsCheckable="true" />  
      <MenuItem Header="_Close" IsCheckable="true" />  
   <MenuItem Header="_Save" IsCheckable="true" />  
</MenuItem>  

来源:https://www.c-sharpcorner.com/uploadfile/mahesh/menus-in-wpf/

这篇文章介绍了如何在WPF中创建菜单。在WPF中,可以使用Menu控件创建菜单。菜单可以是顶级菜单或子菜单。为菜单项添加图像和快捷键也是可行的。


0
如果您从 CodeBehind 创建上下文菜单,可以通过编程方式添加子菜单,如下所示:
    private void OuterBorderMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (sender is not Border border)
            return;

        border.ContextMenu = new ContextMenu();
        border.ContextMenu.Items.Add("Kamera");
        border.ContextMenu.Items.Add("Notruf");

        var anzeigerMenu = new MenuItem();
        anzeigerMenu.Header = "Anzeiger";
        anzeigerMenu.Items.Add("ALLES");
        border.ContextMenu.Items.Add(anzeigerMenu);

        border.ContextMenu.PlacementTarget = border;
        border.ContextMenu.IsOpen = true;
        e.Handled = true;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接