2009-11-24 12 views
2

Étant donné ce morceau de XAMLWPF question templating/coiffant

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

    ... 
    ... 

Je voudrais savoir pourquoi l'en-tête de boîte de groupe ne figure pas dans rouge lettres.

J'ai déjà essayé de styler le type d'étiquette sans succès non plus.

(désolé le titre du message trop générique ... Je ne pouvais pas penser à quelque chose de plus meaninful)

Répondre

1

Ce code a résolu le problème:

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

Cependant, je ne sais toujours pas pourquoi le projet de code n'a pas fonctionné.

1

essayez ceci:

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

Vous n'avez pas besoin pour ce templet . Mais si vous exigez d'utiliser un Templete, vous devez probablement définir le Groupbox.HeaderTemplet et non le GroupBox.Templet.

Edit:

C'est ce que je suis arrivé à ce jour, mais je continue à obtenir un 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

Cela fonctionne presque, mais il devient rouge chaque TextBlock à l'intérieur de la GroupBox. En plus de cela, dans le code montré dans la question, je simplifie un peu mon scénario ... en fait je voudrais définir la propriété "Style" du TextBlock conforme à l'en-tête du GroupBox. – gschuager

+0

Merci pour le pointeur vers GroupBox.HeaderTemplate – gschuager

+0

Sry, je ne pouvais pas vous aider, mais je reçois une erreur étrange sur ma solution (qui est similaire à Yacoders réponse (sauf qu'il ne compile pas), mais je suppose que je peut cesser de travailler là-dessus, une solution devrait suffire). –

1

Il semble que le ContentPresenter ne pas utiliser TextBlock pour afficher la chaîne que vous fournissez en-tête ou définit explicitement son style, donc le style que vous avez défini ne peut pas être appliqué.

Si vous êtes certain de n'utiliser que du texte comme en-tête de groupe, vous pouvez supprimer le ContentPresenter et utiliser le TextBlock par vous-même.

<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

Qu'est-ce que c'est que ""? –

+0

Oh, cette question mérite une grande réponse séparée :) Mais, fondamentalement, un ContentPresenter vous permettra d'avoir presque tout type de contenu dans l'en-tête: texte, images, formes graphiques, etc. Alors que cette solution ne traitera qu'un en-tête de texte . http://social.msdn.microsoft.com/forums/fr-FR/wpf/thread/a2988ae8-e7b8-4a62-a34f-b851aaf13886#contentpresenter –

+0

Je sais à quoi sert ContentPreseneter, mais je ne vois pas le besoin de cela dans votre réponse. –