重写MenuItem ControlTemplate防止单击项目时关闭ContextMenu

问题描述

我正在使用WPF并像这样覆盖ControlTemplate的{​​{1}}:

MenuItem

我的上下文菜单打开得很好,当我单击该项目时,它激活按钮的命令也很好,但是上下文菜单没有关闭。关于单击项目后关闭上下文菜单要做什么的任何建议?

解决方法

从模板中删除Button,并处理Command本身的MenuItem

<Button Content="Click Me" Margin="5">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Command="{Binding MenuItemCommand}">
                <MenuItem.Template>
                    <ControlTemplate>
                        <TextBlock Text="Item 1" Margin="5"/>
                    </ControlTemplate>
                </MenuItem.Template>
            </MenuItem>
        </ContextMenu>
    </Button.ContextMenu>
</Button>
,

要隐藏MenuItem的默认背景,可以这样设置样式:

<Button Content="Click Me" Margin="5">
    <Button.ContextMenu>
        <ContextMenu>
            <ContextMenu.Resources>
                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Border Name="bdr" Margin="-5" Padding="10" Background="White">
                                    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=Header}"/>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsMouseOver"  Value="True">
                                        <Setter Property="Background" TargetName="bdr" Value="AliceBlue"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ContextMenu.Resources>
            <MenuItem Header="Item 1" Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu},Path=DataContext.MenuItemCommand}"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>