MenuItem样式覆盖单个角色样式

时间:2014-10-29 07:59:40

标签: c# wpf wpf-controls menuitem

有没有办法覆盖MenuItem的单一角色样式?我知道覆盖MenuItem的IsHighlighted颜色的方法是覆盖ContentTemplate。我想要的是覆盖ContentTemplate for Role" SubmenuItem"

<Style x:Key="ActionMenuItemStyle" TargetType="{x:Type MenuItem}">
    <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
    <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
    <Setter Property="Background" Value="Transparent" />
    <Setter Property="Template" Value="{StaticResource SubmenuItemTemplateKey2}" />
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="Role" Value="TopLevelHeader">
            <Setter Property="Padding" Value="7,2,8,3" />
            <Setter Property="Template" Value="???" />
            <Setter Property="Foreground" Value="White" />
        </Trigger>
        <Trigger Property="Role" Value="TopLevelItem">
            <Setter Property="Padding" Value="7,2,8,3" />
            <Setter Property="Template" Value="???" />
        </Trigger>
        <Trigger Property="Role" Value="SubmenuHeader">
            <Setter Property="Padding" Value="2,3,2,3" />
            <Setter Property="Template" Value="???" />
        </Trigger>
        <Trigger Property="Role" Value="SubmenuItem">
            <Setter Property="Padding" Value="2,3,2,3" />
        </Trigger>
    </Style.Triggers>
</Style>

{StaticResource SubmenuItemTemplateKey2}是我的覆盖ContentTemplate。对于我想要的其他角色,请使用MenuItem的默认模板。有没有办法做到这一点?

祝你好运

LÜTZE

1 个答案:

答案 0 :(得分:0)

您尝试覆盖所有菜单项,然后尝试再次覆盖它(将其设置回默认样式)。在这种情况下,您只需要覆盖SubmenuItem角色的菜单项,因此代码可以是这样的:

<Style x:Key="ActionMenuItemStyle" TargetType="{x:Type MenuItem}">
  <Setter Property="HorizontalContentAlignment" 
         Value="{Binding Path=HorizontalContentAlignment, 
         RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
  <Setter Property="VerticalContentAlignment" 
         Value="{Binding Path=VerticalContentAlignment, 
         RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
  <Setter Property="Background" Value="Transparent" />
  <Setter Property="Foreground" Value="Black" />
  <Style.Triggers>
    <Trigger Property="Role" Value="TopLevelHeader">
        <Setter Property="Padding" Value="7,2,8,3" />
        <Setter Property="Foreground" Value="White" />
    </Trigger>
    <Trigger Property="Role" Value="TopLevelItem">
        <Setter Property="Padding" Value="7,2,8,3" />
    </Trigger>
    <Trigger Property="Role" Value="SubmenuHeader">
        <Setter Property="Padding" Value="2,3,2,3" />
    </Trigger>
    <Trigger Property="Role" Value="SubmenuItem">
        <Setter Property="Padding" Value="2,3,2,3"/>
        <!-- override here -->
        <Setter Property="Template" 
                Value="{StaticResource SubmenuItemTemplateKey2}"/>
    </Trigger>
  </Style.Triggers>
</Style>

否则(遵循原始方法),我们可能需要一些具有默认样式的虚拟MenuItem元素。然后我们可以将任何项目的模板绑定到该虚拟元素的模板以恢复其默认样式。