2010-08-18 18 views
7

Hier ist eine neue Frage zu WPF TabControl, TabItem und TabPanel. Es gibt eine verwandte Frage zu StackOVF mit einer Antwort, die ich gerne in meiner App verwendet habe. Hier ist ein Link auf die Antwort, und der Code-Snippet auch:WPF-Stile für 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> 

Während dies ist wunderbar, ich würde gerne die Ressourcen und Stil Zeug zu einem besseren Ort zu bewegen (ein Stylesheet oder das Gleiche). Mein erster Versuch war, das <TabControl.Resources> Umbau zum <Window.Resources> zu bewegen, aber dieses funktionierte nicht. Ich habe verschiedene Varianten ausprobiert, konnte es aber nicht zum Laufen bringen. Hier ist ein Beispiel für einen Versuch mir etwas erwartet funktionieren:

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

Suche im Web und Msdn nicht mir helfen, mein Problem zu lösen, sondern ließ mich mit einer zweiten (bezogen) Frage: Was eigentlich ist ein TabPanel und wie verhält es sich mit dem TabControl?

Jede Hilfe und Tipps würden sehr geschätzt werden.

(Hrsg. Im letzten Beispiel kommentierte, dass der Code nicht für mich arbeiten)

Antwort

9

alt text

TabControl nutzt eine spezielle TabPanel Klasse und nicht ein generisches Gremium wie Stackpanel, denn wenn man herumspielen mit dem TabControl Sie erkennen, dass die Platte recht tut ein paar Dinge, die generische Panels nicht tun. Einer passt die Tab-Header-Elemente in mehreren Zeilen an. Ein anderes ist, dass die Zeilen der Elemente neu angeordnet werden, so dass der ausgewählte Tabitem-Header immer in der letzten Zeile ist. Ich denke, es könnte noch mehr tun

Ich bin ziemlich interessiert zu wissen, warum nicht den Stil in den Fenster-Ressourcenabschnitt setzen funktioniert. Meine erste Reaktion war, dass es funktionieren sollte, bis ich es versuchte. Ich füge das als eine Antwort hinzu, weil SO mich ein Bild in einem Kommentar nicht hinzufügen lassen wird.

+0

"Meine anfängliche Reaktion war es sollte funktionieren bis ich es ausprobiert habe." Ah! Also bin ich ** noch gesund :) Danke für deine Erklärung zum TabPanel NVM. Macht Sinn. Ein 'Anhaltspunkt', den ich während meiner Untersuchung gefunden habe, ist, dass es (wenn ich das richtig verstanden habe), dass es kein XAML für TabPanel gibt (so scheint es). Zum Beispiel können Sie kein '' '' Element zum TabControl hinzufügen. (Bearbeiteter Kommentar) – Jeroen

+0

Ein bisschen spät, aber durch meine alten Fragen habe ich tatsächlich gesehen, dass du eine meiner Fragen beantwortet hast. Kredit, wo Kredit fällig ist :) – Jeroen

1

Sie müssen wahrscheinlich einen Control zu schaffen, dies zu tun.

Ich kenne ControlTemplates noch nicht sehr gut. Ich gehackt dieses Beispiel aus: 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

Danke für die Idee Chris. Ich habe Samples wie diese gesehen, aber das scheint eine Menge Code zu sein, nur um eine Layout-Eigenschaft der Tabheader zu ändern, da man damit das gesamte ControlTemplate erstellen kann. Vielleicht kann ein Guru eine zweite Meinung einwerfen, sagen Sie uns, ob das der richtige Weg ist? – Jeroen

+0

Ich weiß, was du meinst :) Ich spielte herum und versuchte zu ändern, wie der Expander aussah, und es ist kein einfacher Prozess. Also ich hoffe auch jemand hat einen besseren Weg :) – Crispy

Verwandte Themen