Wpf 带子菜单的可检查菜单项

Wpf 带子菜单的可检查菜单项,wpf,menuitem,Wpf,Menuitem,您可以在WPF中将顶层设置为可检查的子菜单吗?我好像没法让它工作 <Window.ContextMenu> <ContextMenu> <MenuItem Header="Top Level 1" IsCheckable="True" IsChecked="True"> <MenuItem Header="Sub Level" /> <MenuItem Header="S

您可以在WPF中将顶层设置为可检查的子菜单吗?我好像没法让它工作

<Window.ContextMenu>
    <ContextMenu>
        <MenuItem Header="Top Level 1" IsCheckable="True" IsChecked="True">
            <MenuItem Header="Sub Level" />
            <MenuItem Header="Sub Level" />
        </MenuItem>
        <MenuItem Header="Top Level 2">
            <MenuItem Header="Sub Level" />
            <MenuItem Header="Sub Level" />
        </MenuItem>
    </ContextMenu>
</Window.ContextMenu>



顶层1是可检查的,但子层不显示。有什么想法吗?

如果深入研究
MenuItem
ControlTemplate
,您会发现它使用不同的模板,具体取决于它的
角色
属性

参考:


我强烈建议将此功能转换/封装为
附加属性
行为

,以添加到decyclone的答案中:

由于执行此操作后,菜单仍将处于打开状态,如果希望关闭,则可以通过在父上下文菜单上设置IsOpen=false来关闭菜单:

private void MenuItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
    (sender as MenuItem).IsChecked = !(sender as MenuItem).IsChecked; 
    ((sender as MenuItem).Parent as ContextMenu).IsOpen = false;
} 

另一种方法是简单地使用复选框作为菜单项的图标:

<MenuItem>
    <MenuItem.Icon>
        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding MyCheckProperty}"/>
    </MenuItem.Icon>
    <MenuItem Header="Item1"/>
    <MenuItem Header="Item2"/>
</MenuItem>


在这种情况下,用户必须单击复选框(不仅仅是菜单项上的任何位置)才能更改状态,而单击其他位置将保持立即打开子菜单的默认行为(可能需要也可能不需要)。此外,这允许使用三个状态值。特别是,如果顶级菜单应作为其所有子菜单的主开关,并且null状态指示某些子状态已选中,而某些子状态未选中,则这一点非常好。至于decyclone的答案,除非采取进一步的措施,否则菜单将保持打开状态。

除了我有实现IsChecked功能的子菜单外,其他功能都有效,这会导致级联效应。但这是另一个问题。这很接近,但我需要关闭菜单(假装这是实际选择)。相反,它仍然坐在那里等待输入…这将工作,直到你有多个子菜单。那你就得去见多位家长,没错。在我的例子中,我只需要在顶部菜单上显示这个。
private void MenuItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    (sender as MenuItem).IsChecked = !(sender as MenuItem).IsChecked;
}
private void MenuItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
    (sender as MenuItem).IsChecked = !(sender as MenuItem).IsChecked; 
    ((sender as MenuItem).Parent as ContextMenu).IsOpen = false;
} 
<MenuItem>
    <MenuItem.Icon>
        <CheckBox HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding MyCheckProperty}"/>
    </MenuItem.Icon>
    <MenuItem Header="Item1"/>
    <MenuItem Header="Item2"/>
</MenuItem>