WPF模板/样式问题

时间:2009-11-24 16:47:56

标签: wpf styling templating

鉴于这段XAML

<DockPanel>
  <DockPanel.Resources>
    <Style TargetType="{x:Type GroupBox}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type GroupBox}">
            <DockPanel>
              <Border DockPanel.Dock="Top">
                <Border.Resources>
                  <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Foreground"
                        Value="Red" />
                  </Style>
                </Border.Resources>
                <ContentPresenter ContentSource="Header" />
              </Border>
              <ContentPresenter />
            </DockPanel>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </DockPanel.Resources>

  <GroupBox VerticalAlignment="Top"
      Header="GroupBox header"
      DockPanel.Dock="Top">

    ...
    ...

我想知道为什么组框标题不会以红色字母显示。

我已经尝试过设置Label类型,但也没有成功。

(抱歉过于通用的帖子标题......我无法想到更有意义的事情)

3 个答案:

答案 0 :(得分:1)

试试这个:

<DockPanel.Resources>
    <Style TargetType="{x:Type GroupBox}" >
        <Setter Property="Foreground" Value="Red" />
    </Style>
</DockPanel.Resources>

你不需要一个模板。但是如果你要求使用Templete,你可能必须设置Groupbox.HeaderTemplet而不是GroupBox.Templet。

修改

这是我到目前为止所得到的,但我一直得到XamlPraseException

<Style TargetType="{x:Type GroupBox}" >
    <Setter Property="HeaderTemplate">
        <Setter.Value>
            <ControlTemplate>
                <StackPanel>
                    <StackPanel.Resources>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="Foreground" Value="Red"/>
                        </Style>
                    </StackPanel.Resources>
                    <TextBlock Text="{TemplateBinding GroupBox.Header}" />
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 1 :(得分:1)

似乎ContentPresenter不使用TextBlock来显示您提供的字符串作为标题或显式设置其样式,因此无法应用您定义的样式。

如果您确定只使用文字作为群组标题,则可以删除ContentPresenter并自行使用TextBlock

  <DockPanel>
  <DockPanel.Resources>
    <Style TargetType="{x:Type GroupBox}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type GroupBox}">
            <DockPanel>
              <Border DockPanel.Dock="Top">
                <Border.Resources>
                  <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Foreground" Value="Red" />
                  </Style>
                </Border.Resources>
                <TextBlock Text="{TemplateBinding Header}"></TextBlock>
              </Border>
              <ContentPresenter />
            </DockPanel>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </DockPanel.Resources>

  <GroupBox VerticalAlignment="Top"
      Header="GroupBox header"
      DockPanel.Dock="Top"/>
  </DockPanel>

答案 2 :(得分:1)

此代码解决了问题:

<DockPanel>
  <DockPanel.Resources>
    <Style TargetType="{x:Type GroupBox}">
      <Setter Property="HeaderTemplate">
        <Setter.Value>
          <DataTemplate>
            <DataTemplate.Resources>
              <Style TargetType="Label">
                <Style.Setters>
                  <Setter Property="Foreground" Value="Red" />
                </Style.Setters>
              </Style>
            </DataTemplate.Resources>
            <Label Content="{Binding}" />
          </DataTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </DockPanel.Resources>

  <GroupBox VerticalAlignment="Top" Header="GroupBox header" DockPanel.Dock="Top">
  ...
  ...

但是,我仍然不知道为什么建议的代码没有用。