TabControl / TabPanel / TabItem的WPF样式

时间:2010-08-18 21:25:55

标签: wpf xaml tabcontrol tabpanel

这是关于WPF TabControl,TabItem和TabPanel的新手问题。在StackOVF上有一个相关的问题,我在我的应用程序中愉快地使用了答案。这是答案的链接,以及代码片段:

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>

虽然这很棒,但我很乐意将资源和样式的东西移到更好的位置(样式表等)。我的第一次尝试是将<TabControl.Resources>标记移到<Window.Resources>,但这不起作用。我尝试了几种变化但无法使其工作。以下是我有望尝试的尝试示例:

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

搜索网络和msdn并没有帮助我解决我的问题,而是给我留下了第二个(相关)问题:实际上一个TabPanel,它与TabControl有什么关系? ?

非常感谢任何帮助和提示。

(已编辑:在上一个示例中评论说代码对我不起作用。)

2 个答案:

答案 0 :(得分:10)

alt text

TabControl使用专门的TabPanel类,而不是像StackPanel这样的通用面板,因为如果你搞乱了TabControl,你会发现面板做了很多通用面板不做的事情。一种是调整多行中的选项卡标题项。另一个是项目行将重新排列,以便选定的tabitem标题始终位于最后一行。我想它可能会做得更多

我很想知道为什么将样式放在窗口资源部分中不起作用。我最初的反应是它应该工作,直到我尝试它。我将此作为答案添加,因为我不会让我在评论中添加图像。

答案 1 :(得分:1)

您可能需要创建一个ControlTemplate才能执行此操作。

我对ControlTemplates还不是很熟悉。我破解了这个例子: 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>