【问题标题】:Menu item won't show context menu菜单项不会显示上下文菜单
【发布时间】:2013-07-19 23:03:41
【问题描述】:

我有一个按钮,点击后会显示一个 ContextMenu。在这个 ContextMenu 中,我有 MenuItems。如果左键单击 MenuItem,它应该执行一个命令。到目前为止,所有这些行为都可以使用以下代码正常工作:

<Button.ContextMenu>
    <ContextMenu>
        <ContextMenu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                 <Setter Property="Command" Value="{Binding StartContextMenuCommand}" />
                 <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
            </Style>
        </ContextMenu.ItemContainerStyle>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.1}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.2}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.3}"/>
        <MenuItem Header="{x:Static Name:ContextMenuStartNames.4}"/>
    </ContextMenu>
</Button.ContextMenu>

现在我希望每个菜单项都有一个带有一个 MenuItem 的上下文菜单。由于左键单击会调用 MenuItem 上的命令,因此我希望右键单击行为显示以下 ContextMenu:

<ContextMenu>
      <MenuItem Header="Set Default"></MenuItem>
</ContextMenu>

我试着把它作为一个设置器放在 ItemContainerStyle 中。我还尝试将其作为 MenuItem 的 ContextMenu,但我的任何尝试都没有奏效。我确信我可以想出一个老套的方法来做到这一点,但我想让它保持干净和简单。

【问题讨论】:

  • 我不相信会有我想要的行为。我想要一个菜单​​项菜单,我可以在其中右键单击菜单项并显示上下文菜单。
  • 您可以获得菜单项的菜单,TreeView 是一个嵌套菜单,每个 TreeViewItem 都有自己的 ContextMenu,您可以在任何您想要的事件上显示。
  • 这可行,但 TreeViewItem 不包含 IsChecked。所以这是我必须添加的行为。也许它可以工作,但它似乎不是我正在寻找的控制。

标签: c# wpf contextmenu menuitem itemcontainerstyle


【解决方案1】:

也许我不明白你的问题(我的英语不是......有什么特别的):D 但如果你只想要多级上下文菜单,这应该可以工作:

<ContextMenu>
    <MenuItem Header="Top Level 1">
        <MenuItem Header="Sub Level" />
        <MenuItem Header="Sub Level" />
    </MenuItem>
    <MenuItem Header="Top Level 2">
        <MenuItem Header="Sub Level" />
        <MenuItem Header="Sub Level" />
    </MenuItem>
</ContextMenu>

【讨论】:

  • 史蒂文,感谢您的意见。这会让我嵌套菜单项。但我希望能够拥有一个 MenuItems 的 ContextMenu。而每个MenuItem,我希望能够右键单击并弹出另一个ContextMenu。
【解决方案2】:

这是我目前对这个问题的修复,但我一点也不喜欢它。我想尽可能避免代码落后。

<ContextMenu.ItemContainerStyle>
      <Style TargetType="{x:Type MenuItem}">    
          <Setter Property="Command" Value="{Binding StartCommand}" />
          <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self}, Path=Header}" />
          <Setter Property="ContextMenu"> 
             <Setter.Value>
                <ContextMenu StaysOpen="True">
                    <MenuItem Header="Set As Default"/>
                </ContextMenu>
             </Setter.Value>
          </Setter>
          <EventSetter Event="PreviewMouseRightButtonUp" Handler="MenuItem_Click"/>
      </Style>
</ContextMenu.ItemContainerStyle>

以及背后的代码:

 private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        ButtonContextMenu.StaysOpen = true;
        (sender as MenuItem).ContextMenu.IsOpen = true;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多