1

我有Style一个Expander. 我希望 的Foreground属性Header不同于Content.

<Style TargetType="Expander">
  <Setter Property="Foreground" Value="Red"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Expander">
        <StackPanel>
          <ContentControl Content="{TemplateBinding Header}" Foreground="{TemplateBinding Foreground}"/>            
          <ContentControl Content="{TemplateBinding Content}" Foreground="Blue" TextBlock.Foreground="Blue"/>
        </StackPanel>
       </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

<Expander>
  <Expander.Header>
    <TextBlock Text="Header"/>
  </Expander.Header>
  <Expander.Content>
    <TextBlock Text="Content"/>
  </Expander.Content>
</Expander>

但是,一旦Style应用 ,Header和都将Content返回为红色,即Expander样式Foreground颜色。

如何让Expander样式包含多种Foreground颜色。

实际渲染

4

1 回答 1

2

首先,在模板中最好使用ContentPresenter, 而不是ContentControl,这是一种常见的做法。引用回复Nir(问题:ContentControl 和 ContentPresenter 有什么区别?):

ContentControl 是包含其他元素并具有 Content-property(例如 Button)的控件的基类。ContentPresenter 在控件模板中用于显示内容。ContentControl,当直接使用时(它应该被用作基类),有一个控件模板,它使用 ContentPresenter 来显示它的内容。

在 ControlTemplate 内部使用 ContentPresenter;

在 ControlTemplate 之外(包括 DataTemplate 和外部模板)尽量不要使用其中任何一个,如果需要,您必须首选 ContentPresenter;

如果您正在创建一个托管内容的自定义“无外观”控件并且您无法通过更改现有控件的模板获得相同的结果(这应该非常罕见),则子类 ContentControl。

二、施工类型:

<Expander Header="MyHeader">
    <Expander.Content>
        <TextBlock Text="Content"/>
    </Expander.Content>
</Expander>

你会自动覆盖你的template (style),所以颜色在任何地方都是一样的,因为Red是设置的,取自Style setter.

所以,一个稍微修改的例子:

<Style TargetType="{x:Type Expander}">
    <Setter Property="Foreground" Value="Red"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Expander}">
                <StackPanel>
                    <Border BorderThickness="{TemplateBinding BorderThickness}" TextBlock.Foreground="{TemplateBinding Foreground}">
                        <ContentPresenter Content="{TemplateBinding Header}" />
                    </Border>

                    <Border Name="Content" BorderThickness="{TemplateBinding BorderThickness}" TextBlock.Foreground="Blue">
                        <ContentPresenter Content="{TemplateBinding Content}" />
                    </Border>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Grid>
    <!-- Work -->
    <Expander Header="MyHeader" Content="MyContent" />

    <!-- Not work -->
    <!--<Expander Header="MyHeader">
        <Expander.Content>
            <TextBlock Text="Content"/>
        </Expander.Content>
    </Expander>-->
</Grid>

要研究工作风格,您可以采用预定义的风格(例如MSDN),然后从那里进行更改。

Note:最好为内容设计一个通用的模板,因为如果你设置的内容不是TextBlock, color forTextBlock将毫无用处。也许最好为TextBlock.

于 2013-07-04T16:52:01.493 回答