2

鉴于这段 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 类型的样式,但也没有成功。

(很抱歉帖子标题过于笼统……我想不出更有意义的东西)

4

3 回答 3

1

试试这个:

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

你不需要一个模板。但是如果您需要使用模板,您可能必须设置 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>
于 2009-11-24T16:59:36.280 回答
1

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

如果您确定仅将文本用作组框标题,则可以删除ContentPresenter并自行使用 a 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>
于 2009-11-24T17:23:50.723 回答
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">
  ...
  ...

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

于 2009-11-24T17:24:02.953 回答