2010-11-22 9 views
2

Dans mon application Phone 7, j'utilise un contrôle de pivot. Maintenant, j'aimerais changer l'arrière-plan de son titre et de sa zone d'en-tête. Comment puis-je atteindre cet objectif?Modification de l'arrière-plan du titre et de l'en-tête dans le contrôle du pivot

Existe-t-il un modèle global pour le contrôle de pivot qui peut être personnalisé?

J'ai déjà essayé de définir l'arrière-plan de la grille contenant le contrôle du pivot sur la couleur de l'en-tête, puis de définir l'arrière-plan de chaque élément pivot sur la couleur d'arrière-plan d'origine. Ça a l'air bien à première vue. Mais lorsque vous essuyez l'élément de pivotement vers la gauche pour afficher le deuxième élément, une zone colorée dans la couleur de l'en-tête apparaît entre les deux éléments de pivot. Donc, cette approche ne fonctionne pas.

En outre, j'ai essayé de personnaliser le modèle du titre et de l'en-tête. Mais ces modèles ne couvrent que la zone du texte elle-même, et non toute la zone de l'en-tête et du modèle.

Répondre

10

Voici la variante de modification du modèle de contrôle. Changez l'arrière-plan = "Rouge" à n'importe quel pinceau que vous voulez.

<Style x:Key="PivotStyle1" TargetType="controls:Pivot"> 
    <Setter Property="Margin" Value="0"/> 
    <Setter Property="Padding" Value="0"/> 
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="ItemsPanel"> 
    <Setter.Value> 
     <ItemsPanelTemplate> 
     <Grid/> 
     </ItemsPanelTemplate> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="controls:Pivot"> 
     <Grid HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
       VerticalAlignment="{TemplateBinding VerticalAlignment}"> 
      <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <Grid Background="Red" CacheMode="BitmapCache" Grid.RowSpan="2" /> 
      <Grid Background="{TemplateBinding Background}" CacheMode="BitmapCache" 
       Grid.Row="2" /> 
      <ContentPresenter ContentTemplate="{TemplateBinding TitleTemplate}" 
          Content="{TemplateBinding Title}" Margin="24,17,0,-7"/> 
      <controlsPrimitives:PivotHeadersControl x:Name="HeadersListElement" 
                Grid.Row="1"/> 
      <ItemsPresenter x:Name="PivotItemPresenter" 
          Margin="{TemplateBinding Padding}" Grid.Row="2"/> 
     </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

.... 

<controls:Pivot Title="MY APPLICATION" Style="{StaticResource PivotStyle1}"> 

.... 
+0

Merci beaucoup, c'est ce que je cherchais. – Codo

+0

@Ostemar Je me rends compte qu'il s'agit d'un ancien post, mais connaissez-vous un moyen de personnaliser chaque élément d'en-tête individuellement? Par exemple; Je voudrais avoir une image différente pour chaque élément d'en-tête. – Craig

2

Vous avez raison de dire que les modèles Titre et En-tête ne sont que les zones de texte réelles. Il peut être possible de remplacer le modèle entier du contrôle Pivot, mais un moyen plus simple serait d'ajouter simplement un rectangle de couleur derrière lui.

<Grid x:Name="LayoutRoot" Background="Transparent"> 
    <Rectangle 
    VerticalAlignment="Top" HorizontalAlignment="Stretch" 
    Height="150" Fill="Red" /> 
    <controls:Pivot Title="MY APPLICATION"> 
    <controls:PivotItem Header="item1"> 
     <Grid/> 
    </controls:PivotItem> 
    <controls:PivotItem Header="item2"> 
     <Grid/> 
    </controls:PivotItem> 
    </controls:Pivot> 
</Grid> 
+0

J'ai eu la même idée aujourd'hui, et cela fonctionne. Cependant, y a-t-il une garantie que le titre et l'entête auront toujours une hauteur totale de 150 pixels (ou plutôt 131 dans mon cas)? – Codo

+0

Il est garanti tant que votre page est liée à une seule orientation. Si ce n'est pas le cas, la largeur de la zone change lorsque l'utilisateur fait pivoter le téléphone. –

+0

Non, le 150 vient d'être sorti de l'air. Mais cela fonctionne aussi si vous prenez en charge le paysage car le titre du pivot et la hauteur de la zone d'en-tête semblent être les mêmes en mode portrait et paysage. – Ostemar

2

Vous pouvez modifier le modèle d'en-tête, ce qui est généralement une meilleure option, car vous ne serez pas à vous soucier de positionnement sur mesure et l'alignement:

<controls:Pivot> 
    <controls:Pivot.HeaderTemplate> 
    <DataTemplate> 
     <Grid Background="White"><TextBloc>Your Header Here</TextBlock></Grid> 
    </DataTemplate> 
    </controls:Pivot.HeaderTemplate> 
</controls:Pivot> 

Cela étant dit, vous postulez l'arrière-plan à une grille de redimensionnement automatique - bien sûr, vous pouvez le redimensionner vous-même pour l'ajuster à la bonne taille. La même chose s'applique à chaque PivotItem, si c'est là que vous voulez changer le titre - il suffit de lier ceux-ci à un DataTemplate similaire.

+0

Non, ça ne marche pas du tout. Comme je l'ai écrit dans ma question, le modèle d'en-tête couvre seulement le texte et ni le titre ni la zone juste autour de l'en-tête et du texte du titre. En outre, votre exemple de code manque également un espace réservé pour le texte d'en-tête. Le résultat net de votre code est que l'en-tête est complètement disparu. – Codo

+0

Modifié - tout ce dont vous avez besoin est un TextBlock. Si vous en avez vraiment besoin, vous pouvez personnaliser le modèle de base en allant dans Expression Blend et en obtenant le modèle d'origine pour le contrôle. Modifiez-le selon vos besoins et utilisez-le simplement dans votre application en tant que DataTemplate personnalisé. –

Questions connexes