Предотвратить ItemContainerStyle от переопределения уже установленного стиля - PullRequest
4 голосов
/ 13 декабря 2010

Есть ли способ предотвратить переопределение ItemContainerStyle, например, уже установленного стиля (например, через <Style TargetType="{x:Type MenuItem}">)?

Стиль для MenuItem уже определен в файле ResourceDictionary XAML,который загружается при запуске приложения:

<ResourceDictionary>
  <Style TargetType="{x:Type MenuItem}">
    <Setter Property="Foreground" Value="{DynamicResource TextForeground}"/>
    .. and so on
  </Style>
</ResourceDictionary>

У меня есть следующее MenuItem определение XAML.MenuItem заключен в ContextMenu универсального TextBlock (просто стоит упомянуть, я думаю).Все идет хорошо с самим меню, но его потомки (фактические значения Enum) получают другой стиль, так как ItemContainerStyle переопределяет его:

<MenuItem Header="DisplayType" 
          Name="DisplayTypeMenu"
          ItemsSource="{Binding Source={StaticResource DisplayTypeValues}}">

  <MenuItem.ItemContainerStyle>
    <Style TargetType="MenuItem">
      <Setter Property="MenuItem.IsCheckable" Value="True" />

      <Style.Triggers>
        <Trigger Property="MenuItem.Header" 
                 Value="{x:Static enums:DisplayType.Description}" >
            <Setter Property="MenuItem.IsChecked" Value="True" />
        </Trigger>
      </Style.Triggers>

    </Style>
  </MenuItem.ItemContainerStyle>

</MenuItem>

ItemContainerStyle проистекает из другой вопрос оmine .

Элемент MenuItem размещается в других слоях, причем верхний слой представляет собой пользовательский ContentControl:

public class SomeGradientPanel : ContentControl
{
    public SomeGradientPanel ()
    {
        DefaultStyleKey = typeof(SomeGradientPanel );
    }
}

Приведенный выше код является хорошим кандидатом на источникПроблема!?

Таким образом, полная структура:

<SomeNameSpace:SomeGradientPanel>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="40"></RowDefinition>
            <RowDefinition Height="20"></RowDefinition>
        </Grid.RowDefinitions>

        <TextBlock x:Name="SomeLabel">

          <TextBlock.ContextMenu>
              <ContextMenu>
                  <!-- The MenuItem code snippet from above !-->
              </ContextMenu>
          </TextBlock.ContextMenu>

        </TextBlock>

    </Grid>
</SomeNameSpace:SomeGradientPanel>

Могу ли я сослаться на уже определенный Style для MenuItem в ItemContainerStyle?Переопределение стиля происходит только для дочерних элементов указанного MenuItem, родитель имеет ожидаемый стиль.

Спасибо за ваш вклад!

1 Ответ

11 голосов
/ 13 декабря 2010

Вы пробовали

<MenuItem.ItemContainerStyle> 
    <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...