WPF ListBox в MenuItem. Как сохранить меню от закрытия при нажатии в ListBox?
Я пытаюсь создать Excel-подобную сортировку / фильтрацию в DataGrid. Я создал это ContextMenu с ListBox внутри Заголовка MenuItem.
Когда я нажимаю на флажок или текст флажка, он ведет себя как ожидалось. Однако если я щелкну в пустом поле флажка / списка или в области заголовка за пределами списка, ContextMenu закроется.
Его пока нет на скриншоте, но я буду добавлять кнопки ОК и Отмена под списком. Нажав один из них, я хочу закрыть ContextMenu.
Если вам нужен XAML, вот он:
<MenuItem x:Name="miListBox"
Focusable="False">
<MenuItem.Header>
<ListBox MaxHeight="150" Focusable="False">
</ListBox>
</MenuItem.Header>
</MenuItem>
1 ответ
ContextMenu
имеет свойство под названием StaysOpen
, Просто установите его true
чтобы не дать ему автоматически закрыться, а затем вам нужно использовать IsOpen
свойство открывать / закрывать вручную:
<ContextMenu StaysOpen="true">
<ContextMenu.Resources>
<!-- ... --->
</ContextMenu>
Редактировать:
Из MSDN, StaysOpen
свойство должно было работать, как следует из названия, однако выглядит так, будто оно просто бесполезно. Потому что это не работает ожидаемо. Каким-то образом IsOpen
всегда устанавливается в значение false автоматически при нажатии на один из элементов MenuIms или когда мы щелкаем за пределами ContextMenu. И как в документации о StaysOpen
, ContextMenu
все еще закрыт, когда IsOpen
установлено в false. Проблема здесь в том, что мы не устанавливаем это вручную, но оно автоматически устанавливается каким-то образом и, следовательно, бесполезностью StaysOpen
,
Мы можем установить StaysOpenOnClick
вместо каждого элемента MenuItem:
<ContextMenu>
<ContextMenu.Resources>
<Style TargetType="MenuItem">
<Setter Property="StaysOpenOnClick" Value="True"/>
</Style>
</ContextMenu.Resources>
<!-- ... -->
</ContextMenu>