如何摆脱子菜单弹出窗口中的非活动死区?

时间:2013-03-17 22:22:07

标签: wpf popup styles contextmenu menuitem

我有一个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

我遇到的问题是子菜单有很多非活动死区,如下图所示:

Dead Space Menus

如果用户点击顶级<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,我仍会遇到同样的问题:

Default Menus

1 个答案:

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