Controlled MenuItem with submenu

Do you have a submenu with the top level set for verification in WPF? I can't seem to get this to work.

<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> 

Top level 1 can be checked, but sub-levels are not displayed. Any thoughts?

+8
wpf menuitem
source share
2 answers

If you delve into the MenuItem ControlTemplate , you will see that it uses different templates depending on this Role property.

Reference:

Menu Styles and Templates

 <Style x:Key="{x:Type MenuItem}" TargetType="{x:Type MenuItem}"> <Setter Property="OverridesDefaultStyle" Value="True" /> <Style.Triggers> <Trigger Property="Role" Value="TopLevelHeader"> <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.TopLevelHeaderTemplateKey}}" /> <Setter Property="Grid.IsSharedSizeScope" Value="true" /> </Trigger> <Trigger Property="Role" Value="TopLevelItem"> <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.TopLevelItemTemplateKey}}" /> </Trigger> <Trigger Property="Role" Value="SubmenuHeader"> <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}" /> </Trigger> <Trigger Property="Role" Value="SubmenuItem"> <Setter Property="Template" Value="{StaticResource {x:Static MenuItem.SubmenuItemTemplateKey}}" /> </Trigger> </Style.Triggers> </Style> 

It looks like it can either allow validation, or the default subelements.

To get around this, use the following code:

XAML:

 <ContextMenu> <MenuItem Header="Top Level 1" Mouse.PreviewMouseUp="MenuItem_MouseLeftButtonUp"> <MenuItem Header="Sub Level" /> <MenuItem Header="Sub Level" /> </MenuItem> <MenuItem Header="Top Level 2"> <MenuItem Header="Sub Level" /> <MenuItem Header="Sub Level" /> </MenuItem> </ContextMenu> 

Code behind:

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

I highly recommend converting / encapsulating this functionality into an Attached Property or Behavior .

+6
source share

To add to the answer to the decyclone:

Since the menu will sit there, they still open after that, and if you want it to close, you can close the menu by setting IsOpen = false in the parent context menu:

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

All Articles