MenuItem Style переопределяет стиль одной роли

Есть ли способ переопределить единый стиль роли MenuItem? Я знаю, что способ переопределить цвет IsHighlighted для MenuItem - переопределить шаблон ContentTemplate. То, что я хочу, это переопределить ContentTemplate для роли "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. Есть ли способ сделать это?

С наилучшими пожеланиями

Lutze

1 ответ

Решение

Вы пытаетесь переопределить все пункты меню, а затем снова пытаетесь переопределить его (чтобы вернуть стиль по умолчанию). В этом случае вам просто нужно переопределить пункт меню с ролью 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, который имеет стиль по умолчанию. Затем мы можем связать шаблон любых элементов с шаблоном этого фиктивного элемента, чтобы восстановить их стиль по умолчанию.

Другие вопросы по тегам