我有一个按钮,此按钮有一个上下文菜单。当左键单击按钮时,我使用按钮单击触发器将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>
答案 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>
希望有所帮助!