MenuItem 中的 WPF 列表框。单击列表框时如何防止菜单关闭?

WPF ListBox in MenuItem. How to keep menu from closing when clicking in ListBox?

我正在尝试在 DataGrid 中创建 Excel-like sorting/filtering。我在 MenuItem 的 Header 内创建了一个带有 ListBox 的 ContextMenu。

当我单击复选框或复选框的文本时,它的行为符合预期。但是,如果我单击 checkbox/listbox 的白色 space 或列表框外的 header space,上下文菜单将关闭。

它还没有出现在屏幕截图中,但我会在列表框下方添加“确定”和“取消”按钮。单击其中之一是当我希望关闭 ContextMenu 时。

如果您需要 XAML,这里是:

    <MenuItem x:Name="miListBox"
              Focusable="False">
        <MenuItem.Header>
                <ListBox MaxHeight="150" Focusable="False">

                </ListBox>
        </MenuItem.Header>
    </MenuItem>

ContextMenu 有一个 属性 叫做 StaysOpen。只需将它设置为 true 以不允许它自动关闭,然后您需要手动使用 IsOpen 属性 到 open/close 它:

<ContextMenu StaysOpen="true">
    <ContextMenu.Resources>

    <!-- ... --->
</ContextMenu>

编辑:

从 MSDN 上看,StaysOpen 属性 应该如其名称所暗示的那样工作,但看起来它只是 没用 .因为它没有按预期工作。当单击其中一个 MenuItem 或单击 ContextMenu 外部时,IsOpen 总是自动设置为 false 。并且在关于 StaysOpen 的文档中,当 IsOpen 设置为 false 时,ContextMenu 仍然关闭。这里的问题是我们没有手动设置它,但它会以某种方式自动设置,因此 uselessness of StaysOpen.

我们可以在每个 MenuItem 上设置 StaysOpenOnClick

<ContextMenu>
    <ContextMenu.Resources>
         <Style TargetType="MenuItem">
              <Setter Property="StaysOpenOnClick" Value="True"/>
         </Style>
    </ContextMenu.Resources>
    <!-- ... -->
</ContextMenu>