2009-11-24 105 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