上下文菜单的WPF子菜单

7qhs6swi  于 2023-03-19  发布在  其他
关注(0)|答案(3)|浏览(249)

如果上下文菜单在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>

这意味着,上下文菜单具有三个元素(Comm1、Comm2和Comm3),并且Comm1具有子菜单SubComm1。
我使我的ContextMenu更加灵活:

<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元素中添加子菜单?

xzlaal3s

xzlaal3s1#

您可以将MenuItem.ItemsSource设置为嵌套集合。这将为任何菜单项生成子菜单。为此,支持MenuItem的模型中应该包含子菜单项集合

<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来设置子菜单项的样式。

x3naxklr

x3naxklr2#

显式指定,无需绑定集合,即可通过嵌套子菜单来添加子菜单。
一个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/

vyswwuz2

vyswwuz23#

如果从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;
    }

相关问题