2010-08-18 15 views
7

Aquí hay una pregunta para principiantes en WPF TabControl, TabItem y TabPanel. Hay una pregunta relacionada en StackOVF con una respuesta que utilicé felizmente en mi aplicación. Aquí hay un enlace a la respuesta, y el fragmento de código así:Estilos WPF para 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> 

Si bien esto es maravilloso, me encantaría para mover los Recursos y cosas del estilo a una mejor ubicación (una hoja de estilo o similares). Mi primer intento fue mover la etiqueta <TabControl.Resources> al <Window.Resources> pero esto no funcionó. Probé varias variaciones pero no pude hacerlo funcionar. He aquí un ejemplo de un intento de que tanto esperaba a trabajar:

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

Buscando en la web y MSDN no ayudó a resolver mi problema, pero en su lugar me dejó con una segunda pregunta (relacionada): lo que realmente es un TabPanel, y ¿cómo se relaciona con el TabControl?

Cualquier ayuda y consejo sería muy apreciado.

(Editado:. Comentada en último ejemplo que el código no funciona para mí)

Respuesta

9

alt text

TabControl utiliza una clase TabPanel especializada y no un panel genérico como StackPanel porque si perder el tiempo con TabControl se dará cuenta de que el panel hace bastante algunas cosas que los paneles genéricos no hacen. Una es ajustar los elementos del encabezado de tabulación en varias filas. Otra es que las filas de elementos se reorganizarán para que el encabezado de tabitem seleccionado siempre esté en la última fila. Supongo que podría estar haciendo aún más

Estoy bastante interesado en saber por qué no funciona poner el estilo en la sección de recursos de la ventana. Mi reacción inicial fue que debería funcionar hasta que lo probé. Estoy agregando esto como respuesta porque SO no me deja agregar una imagen en un comentario.

+0

"Mi reacción inicial fue que debería funcionar hasta que lo intenté". Ah! Así que ** estoy ** aún cuerdo :) Gracias por tu explicación en el TabPanel NVM. Tiene sentido. Sin embargo, una "pista" que encontré durante mi investigación es que (si lo entendí correctamente) es que no hay XAML para TabPanel (parece). Por ejemplo, no puede agregar un elemento '''' al TabControl. (Comentario editado) – Jeroen

+0

Un poco tarde, pero repasando mis viejas preguntas, de hecho vi que respondiste una de mis preguntas. Crédito donde se debe el crédito :) – Jeroen

1

es probable que necesite para crear un ControlTemplate para hacer esto.

Todavía no estoy muy familiarizado con ControlTemplates. Pirateé este ejemplo a partir 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

Gracias por la idea Chris. Vi ejemplos como este, pero parece una gran cantidad de código solo para cambiar una propiedad de diseño de los encabezados, ya que hace que crees toda la plantilla de control. Tal vez un gurú puede arrojar una segunda opinión, dinos si este es el camino a seguir. – Jeroen

+0

Sé lo que quieres decir :) Estuve jugando tratando de cambiar el aspecto del expansor, y no es un proceso fácil. Así que también espero que alguien tenga una mejor manera :) – Crispy

Cuestiones relacionadas