2010-08-18 29 views
7

Voici une question débutant sur le WPF TabControl, TabItem et TabPanel. Il y a une question connexe sur StackOVF avec une réponse que j'ai heureusement utilisée dans mon application. Voici un lien vers la réponse, et l'extrait de code ainsi:Styles WPF pour TabControl/TabPanel/TabItem

WPF: Center TabItems in a TabControl

<TabControl> 
    <TabControl.Resources> 
     <Style TargetType="{x:Type TabPanel}"> 
      <Setter Property="HorizontalAlignment" Value="Center" /> 
     </Style> 
    </TabControl.Resources> 

    <TabItem Header="Test 1" /> 
    <TabItem Header="Test 2" /> 
    <TabItem Header="Test 3" /> 
    <TabItem Header="Test 4" /> 
</TabControl> 

Bien que ce soit merveilleux, j'aimerais déplacer les ressources et des trucs du style à un meilleur emplacement (une feuille de style ou l'équivalent). Ma première tentative a été de déplacer le tag <TabControl.Resources> vers le <Window.Resources> mais cela n'a pas fonctionné. J'ai essayé plusieurs variantes mais je n'ai pas réussi à le faire fonctionner. Voici un exemple d'une tentative, je peu aptes à travailler:

<!-- Doesn't work as expected: --> 
<Window.Resources> 
    <Style TargetType="{x:Type TabPanel}"> 
     <Setter Property="HorizontalAlignment" Value="Center" /> 
    </Style> 
</Window.Resources> 

Recherche sur le web et msdn ne m'a pas aidé à résoudre mon problème, mais m'a laissé avec une seconde (en rapport) question: ce qui en fait est un TabPanel, et comment cela se rapporte-t-il au TabControl?

Toute aide et conseils seraient grandement appréciés.

(Sous la direction:. A commenté dans le dernier exemple que le code ne fonctionne pas pour moi)

Répondre

9

alt text

TabControl utilise une classe TabPanel spécialisée et non un groupe générique comme StackPanel parce que si vous mess avec TabControl vous vous rendrez compte que le panneau ne fait quelques choses que les panneaux génériques ne font pas. L'un consiste à ajuster les éléments d'en-tête de l'onglet sur plusieurs lignes. Un autre est que les lignes des éléments seront réarrangés de sorte que l'en-tête tabitem sélectionné est toujours dans la dernière rangée. Je suppose que cela pourrait faire encore plus

Je suis très intéressé de savoir pourquoi mettre le style dans la section des ressources de la fenêtre ne fonctionne pas. Ma première réaction était que ça devrait marcher jusqu'à ce que je l'aie essayé. J'ajoute ceci comme réponse parce que SO ne me laissera pas ajouter une image dans un commentaire.

+0

"Ma première réaction a été que ça devrait marcher jusqu'à ce que je l'aie essayé." Ah! Donc je suis ** sain d'esprit :) Merci pour votre explication sur la NVM TabPanel. Logique. Un «indice» que j'ai trouvé au cours de mon enquête est que (si j'ai bien compris), il n'y a pas de XAML pour TabPanel (il semble). Par exemple, vous ne pouvez pas ajouter un élément '' '' au TabControl. (Commentaire édité) – Jeroen

+0

Un peu en retard, mais en passant par mes vieilles questions j'ai effectivement vu que vous avez répondu à une de mes questions. Crédit où le crédit est dû :) – Jeroen

1

Vous aurez probablement besoin de créer un ControlTemplate pour le faire.

Je ne suis pas encore très familier avec ControlTemplates. Je piraté cet exemple de: http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.tabpanel.aspx

<Style TargetType="{x:Type TabControl}"> 
     <Setter Property="OverridesDefaultStyle" Value="True" /> 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TabControl}"> 
        <Grid KeyboardNavigation.TabNavigation="Local"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="*"/> 
         </Grid.RowDefinitions> 
         <TabPanel Name="HeaderPanel" 
            Grid.Row="0" 
            Panel.ZIndex="1" 
            Margin="0,0,4,-1" 
            IsItemsHost="True" 
            KeyboardNavigation.TabIndex="1" 
            HorizontalAlignment="Center"/> 
         </Grid> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Merci pour l'idée Chris. J'ai vu des exemples comme celui-ci mais cela semble être beaucoup de code juste pour changer une propriété de mise en page des tabheaders, car cela vous fait créer l'ensemble ControlTemplate. Peut-être un gourou peut-il jeter un second avis, nous dire si c'est le chemin à parcourir? – Jeroen

+0

Je sais ce que tu veux dire :) Je jouais avec essayer de changer la façon dont l'Expander avait l'air, et ce n'est pas un processus facile. Donc, j'espère aussi que quelqu'un a une meilleure façon :) – Crispy