2009-11-24 64 views
2

鉴于这块XAMLWPF模板/造型问题

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

    ... 
    ... 
我想知道为什么组框头不 红色字母显示。

我已经试过样式化标签类型但没有成功。

(约过于笼统文章标题对不起...我没能想到的东西更有实际意义)

回答

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

不过,我仍然不知道为什么建议的代码没有奏效。

1

试试这个:

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

你不需要为这个模板。但是如果您要求使用Templete,则可能必须将Groupbox.HeaderTemple设置为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> 
+0

这几乎可以工作,但它会变成GroupBox内每个TextBlock的红色。除此之外,在问题中显示的代码中,我简化了我的场景...实际上,我想设置符合GroupBox标题的TextBlock的“Style”属性。 – gschuager 2009-11-24 17:09:00

+0

谢谢指向GroupBox.HeaderTemplate – gschuager 2009-11-24 17:25:15

+0

Sry,我帮不了你,但我在我的解决方案(这是类似于Yacoders的答案(除了它不编译),但我想我可以停止工作,一个解决方案应该是足够的)。 – 2009-11-24 17:40:48

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

这是什么“”? – 2009-11-24 17:32:40

+0

噢,这个问题值得大量单独的答案:)但是,基本上ContentPresenter将允许您在标题中具有几乎任何类型的内容:文本,图像,图形形状等等。虽然此当前解决方案将只处理文本标题。 http://social.msdn.microsoft.com/forums/en-US/wpf/thread/a2988ae8-e7b8-4a62-a34f-b851aaf13886#contentpresenter – 2009-11-24 17:41:04

+0

我知道ContentPreseneter的用途,但我没有看到在你的答案中需要。 – 2009-11-24 17:53:49