2011-11-23 44 views
3

我在尝试在XAML中创建的上下文菜单有点麻烦。它应该很简单,只是一个菜单项列表,偶尔也有分隔符。上下文菜单背景着色

我已经能够正确地安排它,所有的项目都在正确的位置,现在我正在进行造型和主题化。我们通过公开一些在应用程序级别换出的命名笔刷来主题化,所以在我的contextmenu,menuitem和separator控件的样式中,我将这些名称绑定为动态资源。到目前为止,所有这些都是沼气标准。

我看到的问题是,对于我的分隔符,我在上下文菜单的左侧有一大块空间,它没有显示与菜单其余部分相同的背景,这非常不直观。你可以看到一个例子,并想象它在我们的黑暗主题中变得更糟!

Imgur

而在我们的黑暗风格:

Imgur

这里是我使用的文本菜单样式和分离器:

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

我不知道这件事是从哪里来的,当我窥探应用程序的视觉树时,我只看到一个带有白色帆布的ContentPresenter,我不知道如何删除。任何人见过这个?

+0

请参阅[菜单样式和模板](http://msdn.microsoft.com/en-us/library/ms752296.aspx) – sll

+0

@sll,所以你认为我可以覆盖contextmenu的ControlTemplate一些使用我的主题颜色的边界属性,如该示例中所示,这可能会解决它? –

+0

@ChesterHusk从我在网上可以看到的,看起来你必须编辑模板来摆脱那个空间。 – Rachel

回答

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的背景属性黑客攻击。 (TemplateBinding?)