WPF:菜单项内的按钮,关闭菜单

WPF:菜单项内的按钮,关闭菜单,wpf,menu,Wpf,Menu,我在菜单项标题中有一个按钮。单击菜单项(不是按钮部分)会按预期关闭菜单,但单击按钮不会关闭菜单,我希望它关闭。我怎样才能解决这个问题 更多背景: 我有两个互为次要变体的命令,我想将它们都放在菜单中。第一个变体大部分时间都会使用,因此我不希望两个菜单项都占用空间,也不希望将它们都放在子菜单中。所以我想到了在菜单项中放置一个辅助命令按钮的想法,如下所示: <Menu> <MenuItem Header="Git"> <MenuItem C

我在菜单项标题中有一个按钮。单击菜单项(不是按钮部分)会按预期关闭菜单,但单击按钮不会关闭菜单,我希望它关闭。我怎样才能解决这个问题

更多背景:

我有两个互为次要变体的命令,我想将它们都放在菜单中。第一个变体大部分时间都会使用,因此我不希望两个菜单项都占用空间,也不希望将它们都放在子菜单中。所以我想到了在菜单项中放置一个辅助命令按钮的想法,如下所示:

<Menu>
  <MenuItem Header="Git">
    <MenuItem Command="{Binding PrimaryCommand}">
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <TextBlock VerticalAlignment="Center" Text="Rebase "/>
          <Button Content="Interactive" Focusable="False"
                  Command="{Binding SecondaryCommand}"/>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
  </MenuItem>
</Menu>

看起来是这样的:


(来源:)

因此,如果我点击按钮,我将获得第二个命令;但是如果我单击菜单项上的其他任何地方,我将获得主命令。在某种程度上,这很有效

问题是,无论我是单击菜单项还是按钮,我已经做出选择,我希望菜单关闭——但如果我单击按钮,它不会关闭菜单。菜单一直开着。我可以看到,在某些情况下,这实际上是一种有用的行为(例如,放大/缩小按钮,您可能希望在每次单击后都单击多次而不关闭菜单,如在Google Chrome的菜单中);但在这种情况下,我确实希望按钮关闭菜单

如果有人想知道这一点,删除它并不能解决问题,只需更改它,使按钮在您第二次下拉菜单时以蓝色(聚焦)边框绘制

我尝试使用超链接而不是按钮,效果相同:单击超链接不会关闭菜单


如何获得嵌入式按钮来关闭菜单?

我刚刚为菜单项添加了PreviewMouseUp事件处理程序,并在处理程序中关闭发送方父项的子菜单:

<MenuItem Command="{Binding PrimaryCommand}" 
          PreviewMouseUp="MenuItem_PreviewMouseUp">
     ...
</MenuItem>


private void MenuItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    // add checks of null value by yourself 
    ((MenuItem)((MenuItem)sender).Parent).IsSubmenuOpen = false;
}

...
private void MenuItem_PreviewMouseUp(对象发送器,鼠标按钮Ventargs e)
{
//自己添加空值检查
((MenuItem)((MenuItem)发件人).Parent.IsSubmenuOpen=false;
}

若你们正在避免代码隐藏(像我一样),那个么你们可以为菜单项创建行为

下面是一个类似问题的答案: