2010-12-13 7 views
4

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

Стиль для 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 вытекает из another question of 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, у родителя есть ожидаемый стиль.

Благодарим вас за ввод!

ответ

10

Вы пробовали

<MenuItem.ItemContainerStyle> 
    <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}"> 
+0

Да, но это делает ребенок, которые будут отображаться с еще более основным стилем, чем раньше (например, отсутствует текст/заголовок). Еще раз спасибо за ваш ввод! – Dr1Ku

+0

@ Dr1Ku: Уверенная вещь :) Я не могу воспроизвести это. Есть ли у вас какие-либо другие ресурсы, которые могут привести к применению неявного стиля MenuItem? Как PresentationFramework.Aero или что-то в app.xaml? –

+0

@ Dr1Ku: Если вы удалите стиль для ItemContainerStyle, он отлично работает? –

Смежные вопросы