数据绑定ContextMenu分隔符不支持全局分隔符样式

时间:2010-07-21 19:50:31

标签: c# wpf

我有一个绑定到数据源的上下文菜单。对于此上下文菜单,如果数据绑定对象的Separator属性值为“True”,则我有一个DataTrigger来显示分隔符。这很好用,但它似乎没有为我的应用程序中的分隔符选择我的全局样式。新的分隔符外观与我的菜单的其余部分不同。有没有办法让它使用全球风格?

以下是ContextMenu定义:

<ContextMenu  
  x:Key="ActionMenu" 
  ItemsSource="{Binding Source={StaticResource ActionMenuSource}}">
      <ContextMenu.ItemContainerStyle> 
          <Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}"> 
          <Style.Triggers> 
              <DataTrigger Binding="{Binding Path=Separator}" Value="true"> 
                  <Setter Property="MenuItem.Template"> 
                      <Setter.Value> 
                          <ControlTemplate TargetType="{x:Type MenuItem}"> 
                              <Separator Style="{DynamicResource {x:Static             
                                         MenuItem.SeparatorStyleKey}}"/> 
                          </ControlTemplate> 
                      </Setter.Value> 
                  </Setter> 
              </DataTrigger> 
          </Style.Triggers> 
      </Style> 
   </ContextMenu.ItemContainerStyle> 
</ContextMenu>

以下是我定义分隔符的全局值。

<Style x:Key="{x:Static MenuItem.SeparatorStyleKey}" TargetType="{x:Type Separator}">
  <Setter Property="Template" Value="{DynamicResource tmp_ManhMenuItemSeparator}"/>
</Style>

<ControlTemplate x:Key="tmp_ManhMenuItemSeparator" TargetType="{x:Type Separator}">
  <Rectangle Name="SepRect" StrokeThickness="1" Stroke="White"/>
</ControlTemplate>

1 个答案:

答案 0 :(得分:0)

要使样式成为全局样式,键必须与TargetType相同,而在样本中显然不是这样。将您的密钥更改为“{x:Type Separator}”,看看它是否适合您。您也可以将两个片段合并在一起,除非您特别需要将它们拆分出来,例如

<Style x:Key="{x:Type Separator}" TargetType="{x:Type Separator}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Separator}">
        <Rectangle Name="SepRect" StrokeThickness="1" Stroke="White"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

完成后,您可以删除第一个代码块。看起来您正在尝试手动使用菜单。如果你把它全局化,你就不需要这样做,例如。

    <ContextMenu x:Key="ActionMenu" ItemsSource="{Binding Source={StaticResource ActionMenuSource}}"/>