【问题标题】:WPF templating/styling issueWPF模板/样式问题
【发布时间】:2009-11-24 16:47:56
【问题描述】:

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

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

【问题讨论】:

    标签: wpf styling templating


    【解决方案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">
      ...
      ...
    

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

    【讨论】:

      【解决方案2】:

      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>
      

      【讨论】:

      • 那个“”是干什么用的?
      • 哦,这个问题值得单独回答 :) 但是,基本上 ContentPresenter 将允许您在标题中包含几乎任何类型的内容:文本、图像、图形形状等。虽然这个当前解决方案将只处理文本标题。 social.msdn.microsoft.com/forums/en-US/wpf/thread/…
      • 我知道 ContentPreseneter 的用途,但我认为您的回答中不需要。
      • 我明白了,您的意思是默认内容演示者。如果要显示分组框内容,仍然需要它。
      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 这几乎可以工作,但它在 GroupBox 内的每个 TextBlock 都会变成红色。除此之外,在问题中显示的代码中,我稍微简化了我的场景......实际上我想设置符合 GroupBox 标题的 TextBlock 的“样式”属性。
      • 对不起,我帮不了你,但我的解决方案出现了一个奇怪的错误(类似于 Yacoders 的答案(除了它没有编译),但我想我可以停止正在努力。一个解决方案就足够了)。
      • 我使用一个名为 Kaxaml 的工具来调试这样的 XAML sn-ps。解决一些样式/模板问题的小而方便...
      • 问题是 HeaderTemplate 不接受 ControlTemplate,但如果我更改为 DataTemplate,Templatebinding 将不起作用。 ...我不在乎...我不需要该代码工作 ;)
      猜你喜欢
      • 1970-01-01
      • 2016-03-03
      • 2018-11-01
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多