Tab Item and Tab Control Border Style

前端 未结 4 1763
庸人自扰
庸人自扰 2021-01-01 16:23

How do I style the Tab Control Border so that the selected Tab Item does not have a line underneath it?

\"WPF

相关标签:
4条回答
  • 2021-01-01 16:39

    Instead of modifying tabcontrol template, you may as well just modify the TabItem template, by adding two lines to cover up the border, and using minus margins for covering up.

    (Please take a look at "TopLineCover" and "BottomLineCover" borders.)

    <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>
    
    0 讨论(0)
  • 2021-01-01 16:42

    Add property Padding="0,0,0,0" to tab control :-)

    0 讨论(0)
  • 2021-01-01 16:48

    In the past I've accomplished this by making the TabItem extend a little further down then it's allocated, so its actually drawn on top of the border element and hides it

    I can't remember how I did it exactly, but I think it was with a negative margin on the bottom of the TabItem

    0 讨论(0)
  • 2021-01-01 17:03

    The XAML below is how I have overridden the TabControl to solve this problem. The key piece of info is the Margin property of the HeaderPanel. You will see that the bottom margin is -1, which shifts it down just enough to cover up that line.

        <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>
    
    0 讨论(0)
提交回复
热议问题