TabControl - 使TabItem显示在内容之上

时间:2013-07-17 09:12:40

标签: wpf xaml styles tabcontrol

我有一个TabControl的自定义样式。作为样式的一部分,我希望选定的TabItem出现在内容的顶部。目前TabPanel没有ZIndex设置,因此它显示在内容下方(所需行为)。

我似乎无法工作的是将所选的TabItem显示在内容的顶部。在Panel.ZIndex上设置TabItem似乎无效

<TabPanel x:Name="HeaderPanel" Panel.ZIndex="0" Grid.Column="0" Grid.Row="0" IsItemsHost="true" Margin="2,10,2,0" KeyboardNavigation.TabIndex="1" />

TabItem样式(重要位):

<Trigger Property="IsSelected" Value="true">
    <Setter Property="Panel.ZIndex" Value="1"/>
    <Setter Property="Background" TargetName="Bd" Value="#fff"/>
</Trigger>

这是我现在拥有的图像(左)和我想要的图像(右图)。请注意,TabPanel右侧的阴影来自Border模板本身ContentPresenter周围的TabControl。因此,我希望选定的TabItem出现在它上面!

enter image description here vs enter image description here

P.S。奖励标记,如果有人知道如何使TabPanel的左上角和左下角四舍五入 - 我放弃了试图让它工作

1 个答案:

答案 0 :(得分:0)

您无法更改 TabControl ControlTemplate 吗?

问题似乎是默认的 ControlTemplate http://msdn.microsoft.com/en-us/library/ms754137(v=vs.110).aspx)在 TabPanel 之后声明 ContentPresenter ,有效地强制执行它在Z顺序之上。

一个简单的解决方案可能是简单地从提供的链接复制它,粘贴它并反转 TabPanel 边框元素的顺序(一些调整可能是由于边框现在可能完全位于 TabPanel 之上,因此阻止了它的视图。

<Style TargetType="{x:Type TabControl}">

    <Setter Property="Template">

        <Setter.Value>

            <ControlTemplate TargetType="{x:Type TabControl}">

                <Grid KeyboardNavigation.TabNavigation="Local">

                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>

                    <!-- VisualStateManager stuff... -->

                    <Border Grid.Row="1" ... >

                        <ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent"/>

                    </Border>

                    <TabPanel Grid.Row="0" ... />

                </Grid>

            </ControlTemplate>

        </Setter.Value>

    </Setter>

</Style>

对于 TabPanel 上的圆角,我会再次建议查看 TabPanel 类的 ControlTemplate