我在使用XAML创建的上下文菜单时遇到了一些麻烦。它应该相当简单,只是一个菜单项列表,偶尔会有分隔符。
我已经能够正确排列,所有项目都在正确的位置,现在我正在进行造型和主题化。我们通过公开在应用程序级别换出的一些命名画笔来主题,因此在我的上下文菜单,menuitem和分隔符控件的样式中,我将这些名称绑定为动态资源。到目前为止,所有这些都是沼泽标准。
我看到的问题是,对于我的分隔符,我在上下文菜单的左侧有一大块空间,与菜单的其余部分没有显示相同的背景,这在视觉上非常分散注意力。你可以看到一个例子,并想象它在我们更黑暗的主题上变得更糟!
以我们的黑暗风格:
这是我用于contextmenu和分隔符的样式:
<Style TargetType="{x:Type ContextMenu}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{DynamicResource HighlightBrush}"/>
</Trigger>
<DataTrigger Binding="{Binding ContextMenu.IsOpen,RelativeSource={RelativeSource Mode=Self}}" Value="True">
<Setter Property="Background" Value="{DynamicResource HighlightBrush}"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Background" Value="{DynamicResource BackgroundLight}" />
<Setter Property="Foreground" Value="{DynamicResource ForegroundText}" />
<Setter Property="BorderThickness" Value="1" />
</Style>
<Style x:Key="{x:Static MenuItem.SeparatorStyleKey}" TargetType="{x:Type Separator}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Separator}">
<Grid Margin="0,6,0,4" SnapsToDevicePixels="true">
<Rectangle Margin="30,0,1,1" Height="1" Fill="{DynamicResource BackgroundLight}"/>
<Rectangle Margin="30,1,1,0" Height="1" Fill="{DynamicResource ContextMenuSeparator}"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我不知道这个糟糕的东西来自何处,当我窥探应用程序的可视树时,我只看到一个带有白色Canvas的ContentPresenter,我不知道如何删除。有人见过这个吗?
答案 0 :(得分:1)
先生,您应该能够通过MenuItem.SeparatorStyleKey Property获得所需的行为。
默认样式似乎与以下内容类似:
<Style x:Key="{x:Static MenuItem.SeparatorStyleKey}"
TargetType="{x:Type Separator}">
<Setter Property="MinHeight" Value="2"/>
<Setter Property="Margin" Value="2,4,2,3"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Separator}">
<theme:ClassicBorderDecorator BorderStyle="HorizontalLine"
BorderBrush="{x:Static theme:ClassicBorderDecorator.ClassicBorderBrush}"
BorderThickness="1"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
您可以通过ClassicBorderBrush的Background属性来诱导攻击。 (TemplateBinding?)