2012-03-16 14 views
15

¿Cómo doy estilo al borde de control de pestaña para que el elemento de pestaña seleccionado no tenga una línea debajo?Pestaña Elemento y control de pestaña Estilo de borde

WPF Tab Item

Estos son mi control Tab y Tab Estilos de elementos hasta el momento.

<!-- Tab control styling --> 
     <Style TargetType="{x:Type TabControl}"> 
      <Setter Property="Padding" Value="10,5,10,5" /> 
      <Setter Property="Margin" Value="3.5" /> 
      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" /> 
     </Style> 
     <!-- Tab item styling --> 
     <Style TargetType="{x:Type TabItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type TabItem}"> 
         <Grid> 
          <Border 
           Name="Border" 
           Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" 
           BorderBrush="Black" 
           BorderThickness="1,1,1,0" 
           CornerRadius="3,3,0,0" 
           MinWidth="120"> 
            <ContentPresenter x:Name="ContentSite" 
             VerticalAlignment="Center" 
             HorizontalAlignment="Center" 
             ContentSource="Header" 
             Margin="12,2,12,2"/> 
          </Border> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsFocused" Value="True" > 
           <Setter Property="Background" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" /> 
           <Setter Property="HeaderTemplate"> 
            <Setter.Value> 
             <DataTemplate> 
              <TextBlock FontWeight="Bold" Text="{Binding}"/> 
             </DataTemplate> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
          <Trigger Property="IsMouseOver" Value="True" > 
           <Setter Property="Background" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" /> 
           <Setter Property="HeaderTemplate"> 
            <Setter.Value> 
             <DataTemplate> 
              <TextBlock FontWeight="Bold" Text="{Binding}"/> 
             </DataTemplate> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
          <Trigger Property="IsSelected" Value="True" > 
           <Setter Property="Background" TargetName="Border" Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" /> 
           <Setter Property="HeaderTemplate"> 
            <Setter.Value> 
             <DataTemplate> 
              <TextBlock FontWeight="Bold" Text="{Binding}"/> 
             </DataTemplate> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

Si puedo lograr el aspecto que aparece en la pantalla sin tener que sobrecargar la plantilla de control elemento de ficha a continuación, no tengo un problema ya que la plantilla de elementos pestaña predeterminada no tiene la línea por debajo de ella en el pestaña seleccionada No he podido hacer esto hasta ahora. Gracias por tu ayuda.

+1

Creo que la única opción que tienes es para sobrescribir la plantilla tabcontrol –

+0

Gracias por su comentario. Sí, probablemente tenga que sobrecargar la plantilla de tabcontrol. Simplemente no sé cómo dibujaría la línea superior del borde del tabcontrol para que tenga una línea, pero esa línea no es visible debajo del tabitem seleccionado. Tal vez la plantilla de tabitem podría superponer el control de tabulación en 1 píxel, lo que me permite controlar la visibilidad de línea de borde inferior de tabitem a través de la plantilla de tabitem. Actualmente no estoy seguro de qué hará xaml para que parezca como si fuera posible. – dior001

Respuesta

20

El XAML a continuación es cómo he anulado el control de tabulación para resolver este problema. La pieza clave de información es la propiedad Margin del HeaderPanel. Verá que el margen inferior es -1, que lo desplaza lo suficiente como para cubrir esa línea.

<Setter Property="Template"> 
     <Setter.Value> 

      <ControlTemplate TargetType="{x:Type TabControl}"> 
       <Grid KeyboardNavigation.TabNavigation="Local"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="*" /> 
        </Grid.RowDefinitions> 

        <TabPanel x:Name="HeaderPanel" 
           Grid.Row="0" 
           Panel.ZIndex="1" 
           Margin="0,0,4,-1" 
           IsItemsHost="True" 
           KeyboardNavigation.TabIndex="1" 
           Background="Transparent" /> 

        <Border x:Name="Border" 
          Grid.Row="1" 
          BorderThickness="1" 
          KeyboardNavigation.TabNavigation="Local" 
          KeyboardNavigation.DirectionalNavigation="Contained" 
          KeyboardNavigation.TabIndex="2"> 

         <Border.Background> 
          <SolidColorBrush Color="White"/> 
         </Border.Background> 

         <Border.BorderBrush> 
          <SolidColorBrush Color="White"/> 
         </Border.BorderBrush> 

         <ContentPresenter x:Name="PART_SelectedContentHost" 
              Margin="4" 
              ContentSource="SelectedContent" /> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+1

¿No ocultará eso la línea de fondo de todos los 'TabItems' en lugar de solo 'TabItem' seleccionado? – Rachel

+0

No, no, porque el TabItem actual está encima de los otros TabHeaders. Funciona muy bien. (He estado usándolo por un par de años de esa manera). – Stewbob

+1

¡Excelente! Gracias por tu ayuda. – dior001

1

En el pasado he logrado esto mediante la TabItem extender un poco más abajo entonces se asigna, por lo que su realidad dibujada en la parte superior del elemento de borde y lo oculta

No puedo recordar cómo lo hice exactamente, pero creo que fue con un margen negativo en la parte inferior de la TabItem

1

Agregar propiedad Padding="0,0,0,0" a control de pestañas :-)

+0

En realidad establecerlo en -1 funciona mucho mejor: Relleno = "- 1" – RaceRalph

1

En lugar de modificar la plantilla de tabcontrol, también puede modificar la plantilla de TabItem, agregando dos líneas para cubrir el borde y utilizando márgenes menos para cubrir.

(Por favor, eche un vistazo a "TopLineCover" y las fronteras "BottomLineCover".)

enter image description here

<Style TargetType="TabItem" BasedOn="{StaticResource {x:Type TabItem}}"> 
    <Setter Property="Foreground" Value="{DynamicResource VsBrush.WindowText}"/> 
    <Setter Property="Background" Value="{DynamicResource VsBrush.Window}"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Grid SnapsToDevicePixels="true"> 
        <Border x:Name="HeaderBorder" Padding="8,3,8,3" BorderThickness="1,1,1,0" 
          Background="{DynamicResource {x:Static commonControls:ColorService.JobViewHeaderBrushKey}}" 
          BorderBrush="{DynamicResource {x:Static commonControls:ColorService.JobViewHeaderBorderBrushKey}}"> 
         <ContentPresenter x:Name="Content" ContentSource="Header" 
              HorizontalAlignment="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" 
              VerticalAlignment="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" 
              /> 
        </Border> 
        <Border x:Name="TopLineCover" BorderThickness="1,1,1,0" Margin="0,-2,0,0" Height="3" Panel.ZIndex="100" 
          Background="{DynamicResource VsBrush.Window}" BorderBrush="{DynamicResource {x:Static commonControls:ColorService.JobViewHeaderBorderBrushKey}}" 
          VerticalAlignment="Top" HorizontalAlignment="Stretch" Visibility="Collapsed"/> 
        <Border x:Name="BottomLineCover" BorderThickness="0,0,0,3" Margin="1,0,1,-2" Panel.ZIndex="100" BorderBrush="{DynamicResource VsBrush.Window}" 
          VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Visibility="Collapsed"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsMouseOver" Value="True"/> 
          <Condition Property="IsSelected" Value="False"/> 
         </MultiTrigger.Conditions> 
         <Setter Property="Background" TargetName="HeaderBorder" Value="{DynamicResource VsBrush.Window}"/> 
        </MultiTrigger> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" TargetName="HeaderBorder" Value="{DynamicResource VsBrush.Window}"/> 
         <Setter Property="Visibility" TargetName="TopLineCover" Value="Visible"/> 
         <Setter Property="Visibility" TargetName="BottomLineCover" Value="Visible"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Cuestiones relacionadas