我有一个ContextMenu
,其中包含多个顶级MenuItem
,其中一个包含由ItemsSource
绑定的项目子菜单,如下所示:
<ContextMenu Style="{x:Null}">
<MenuItem Header="{Binding MenuLabelNewSolution}" Command="New"/>
<MenuItem Header="{Binding MenuLabelOpenSolution}" Command="Open"/>
<MenuItem Header="{Binding MenuLabelRecentSolutions}"
ItemsSource="{Binding RecentSolutions, Mode=OneWay}">
<MenuItem.ItemTemplate>
<DataTemplate>
<Button Style="{x:Null}" Margin="0" Content="Test"
Command="vm:CustomCommands.ExplicitOpen"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
<MenuItem Header="{Binding MenuLabelSaveAll}" Command="vm:CustomCommands.SaveAll"/>
</ContextMenu>
上面的子菜单项是测试Button
以说明问题。
下面,我使用扩展列缩小了Style
的{{1}}以说明问题:
MenuItem
我遇到的问题是子菜单有很多非活动死区,如下图所示:
如果用户点击顶级<Style TargetType="{x:Type MenuItem}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<Border Style="{x:Null}" Background="LightBlue"
BorderBrush="Black" BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<ContentPresenter Grid.Column="1" ContentSource="Header" />
<Popup Style="{x:Null}" Margin="0"
IsOpen="{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}"
Placement="Right" VerticalOffset="-3">
<StackPanel Style="{x:Null}" Background="Red"
Margin="0" IsItemsHost="True" />
</Popup>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
(用于图标和手势文本)中的死区,则执行菜单命令。但是,如果用户单击子菜单项中测试按钮外的任何死区,则不执行菜单命令。
我能做什么MenuItem
明智地摆脱子菜单级别的额外空间,或者至少使整个子菜单区域对菜单命令有效?
顺便说一句,如果我恢复为Style
的默认Style
,我仍会遇到同样的问题:
答案 0 :(得分:0)
问题不在我的MenuItem
Style
,而是因为我使用了DataTemplate
来表示子菜单项。以下更改起了作用:
<ContextMenu>
<MenuItem Header="{Binding MenuLabelNewSolution}" Command="New"/>
<MenuItem Header="{Binding MenuLabelOpenSolution}" Command="Open"/>
<MenuItem Header="{Binding MenuLabelRecentSolutions}"
ItemsSource="{Binding RecentSolutions, Mode=OneWay}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="Command" Value="vm:CustomCommands.ExplicitOpen"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
<MenuItem Header="{Binding MenuLabelSaveAll}" Command="vm:CustomCommands.SaveAll"/>
</ContextMenu>