阻止ItemContainerStyle覆盖已设置的Style

时间:2010-12-13 16:08:04

标签: c# wpf xaml wpf-controls

有没有办法阻止ItemContainerStyle重写已经设置的样式(例如通过<Style TargetType="{x:Type MenuItem}">)?

MenuItem的样式已在ResourceDictionary XAML文件中定义,该文件在App启动时加载:

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

我有以下MenuItem XAML定义。 MenuItem包含在通用ContextMenu的{​​{1}}内(我估计值得一提)。一切顺利的菜单本身,但其子(Enum的实际值)得到一个不同的风格,因为TextBlock覆盖它:

ItemContainerStyle

ItemContainerStyle源于another question of mine

MenuItem位于其他图层中,顶层是自定义ContentControl:

<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>

上面的代码似乎是问题根源的一个很好的候选者!?

因此,完整的结构是:

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的子项上,父项具有预期的样式。

感谢您的投入!

1 个答案:

答案 0 :(得分:10)

你试过吗

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