ContextMenu不继承资源样式

时间:2014-05-25 15:20:50

标签: wpf styles contextmenu

我有一个按钮,此按钮有一个上下文菜单。当左键单击按钮时,我使用按钮单击触发器将ContextMenu.IsOpen属性设置为true。 我的问题如下 - 只要我没有右键单击该按钮,上下文菜单就不会继承我在窗口资源中定义的样式。 我搜索了一下,发现上下文菜单的样式只有在右键单击后才会初始化。 即使我没有右键单击它,如何强制样式初始化? (我不能将上下文菜单的样式设置为硬编码,因为我希望它在更改主题时自动更改,而不需要单独维护我的代码上的每个上下文菜单)。 谢谢!

XAML:

`

<Window.Resources>
    <Style TargetType="ContextMenu">
        <Setter Property="Background" Value="Green"/>
    </Style>
</Window.Resources>

<Grid>
    <Button Content="Click Me!" Width="80" Height="50">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <EventTrigger RoutedEvent="Click">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                        <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                    </BooleanAnimationUsingKeyFrames>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
        <Button.ContextMenu>
            <ContextMenu>
                <MenuItem>
                    <MenuItem.Header>
                        <CheckBox Content="Include First Option"/>
                            </MenuItem.Header>
                </MenuItem>
                <MenuItem>
                    <MenuItem.Header>
                        <CheckBox Content="Include Second Option"/>
                    </MenuItem.Header>
                </MenuItem>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</Grid>

2 个答案:

答案 0 :(得分:1)

找到我一直在寻找的答案 - ContextMenu是一个特殊的控件 - 它不是它定义的窗口的一部分,而是一个独立的窗口。右键单击它后,它会检查谁调用它并初始化可继承的属性。但是当以不同的方式打开它时 - 它不知道是谁打开它。 答案 - 为了覆盖上下文菜单的默认样式,必须在App.xaml中定义样式而不使用键。

App.xaml资源应如下所示:

<Application.Resources>
        <Style TargetType="ContextMenu">
            <Setter Property="Background" Value="Green"/>
        </Style>
    </Application.Resources>

答案 1 :(得分:0)

创建自己的完整样式(这里只是一个简单的样本),并使用特殊键。

<Style x:Key="CustomContextMenu"
        TargetType="{x:Type ContextMenu}">
    <Setter Property="Background"
            Value="Green" />
    <Setter Property="BorderBrush"
            Value="#888888" />
    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="SnapsToDevicePixels"
            Value="True" />
    <Setter Property="OverridesDefaultStyle"
            Value="True" />
    <Setter Property="Grid.IsSharedSizeScope"
            Value="true" />
    <Setter Property="HasDropShadow"
            Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContextMenu}">
                <Border Name="Border"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <StackPanel IsItemsHost="True"
                                KeyboardNavigation.DirectionalNavigation="Cycle" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="HasDropShadow"
                                Value="true">
                        <Setter TargetName="Border"
                                Property="Padding"
                                Value="0,3,0,3" />
                        <Setter TargetName="Border"
                                Property="CornerRadius"
                                Value="4" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

使用

<Button.ContextMenu>
    <ContextMenu Style="{StaticResource CustomContextMenu}">
        <MenuItem>
            <MenuItem.Header>
                <CheckBox Content="Include First Option" />
            </MenuItem.Header>
        </MenuItem>
        <MenuItem>
            <MenuItem.Header>
                <CheckBox Content="Include Second Option" />
            </MenuItem.Header>
        </MenuItem>
    </ContextMenu>
</Button.ContextMenu>
希望有所帮助!

enter image description here