2010-06-25 6 views
4

Nouveauté de WPF et dotée d'onglets. Dans chaque onglet, le contenu est présenté dans un panneau/une fenêtre/un coin incurvé. Je n'étais pas sûr de savoir comment faire cela (Style, ControlTemplate) mais j'ai décidé de suivre la méthode DataTemplate.Propriété WPF DataTemplate définie sur Contenu

Alors maintenant, j'ai ce DataTemplate:

<DataTemplate x:Key="TabContentPresenter" > 
    <Border Margin="10" 
      BorderBrush="{StaticResource DarkColorBrush}" 
      CornerRadius="8" 
      BorderThickness="2" 
      Grid.Row="0" 
      Padding="5" 
      Background="{TemplateBinding Background}">   

     <ContentPresenter Content="{Binding}" /> 

    </Border> 
</DataTemplate> 

Comme vous pouvez le voir avec le bien de fond que je wan't pour définir la couleur d'arrière-plan au contenu, mais ne sais pas comment. Ici je l'utilise.

<Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="120"/> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <ContentControl ContentTemplate="{StaticResource TabContentPresenter}" Background="White"> 


       <!-- Something Here --> 

      </ContentControl> 

      <ContentControl ContentTemplate="{StaticResource TabContentPresenter}" Grid.Row="1" Background="Blue"> 

       <!-- Something Here --> 

      </ContentControl> 

     </Grid> 

L'utilisation de DataTemplate est-elle incorrecte ou existe-t-il un autre moyen?

Je pourrais probablement définir l'arrière-plan directement sur le contenu et passer du remplissage dans le modèle à la marge dans le contenu mais dans certaines situations similaires qui ne fonctionneraient pas et il est plus agréable de ne le définir qu'une seule fois.

EDIT:

Selon des conseils j'ai changé pour ControlTemplate et mettre également dans un style. Cela résout le problème d'arrière-plan mais en crée un plus gros. Maintenant, le contenu n'apparaîtra pas. J'ai lu sur un blog here que mettre un targetType résout cela mais cela n'a pas résolu mon problème. Le code ressemble à ceci maintenant et a également changé le ContentControl pour utiliser le style au lieu de Template.

<Style x:Key="TabContentPresenter" TargetType="ContentControl" > 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ContentControl"> 
       <Border Margin="10" 
      BorderBrush="{StaticResource DarkColorBrush}" 
      CornerRadius="8" 
      BorderThickness="2" 
      Grid.Row="0" 
      Background="{TemplateBinding Background}"> 

        <ContentPresenter Content="{Binding}" /> 

       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Répondre

6

Utilisez ControlTemplate à la place DataTemplate

<ControlTemplate x:Key="TabContentPresenter"> 
     <Border Margin="10" 
        CornerRadius="8" 
        BorderThickness="2" 
        Grid.Row="0" 
        Padding="5" 
        Background="{TemplateBinding Background}"> 
      <ContentPresenter Content="{Binding}"/> 
     </Border> 
    </ControlTemplate> 

Utiliser un modèle au lieu de ContentTemplate

<ContentControl Background="Green" Template="{StaticResource TabContentPresenter}"/> 
+0

Cela fonctionne avec l'arrière-plan mais maintenant mon contenu n'apparaît pas à l'intérieur de la bordure. –

+2

En fin de compte, il a fallu changer la propriété ContentPresenter Content en {TemplateBinding Content}. –

5

Peut-être parce que TemplateBinding ne fonctionne pas avec DataTemplate. Check this question for details.

Même si cela fonctionne, tout ce dont vous avez besoin est un ControlTemplate et non un datatemplate.

+0

Merci, je ne sais en effet que TemplateBinding ne fonctionne pas je l'ai mis là pour montrer ce que je voulais. Je ne connais pas vraiment la différence entre DataTemplate et ControlTemplate, donc je ne sais jamais lequel utiliser. –

+0

Le premier lien est cassé. – Deantwo

Questions connexes