TabControl/TabPanel/TabItem的WPF样式

TabControl/TabPanel/TabItem的WPF样式,wpf,xaml,tabcontrol,tabpanel,Wpf,Xaml,Tabcontrol,Tabpanel,这里有一个关于WPF TabControl、TabItem和TabPanel的新手问题。在StackOVF上有一个相关的问题,我在我的应用程序中愉快地使用了一个答案。下面是答案的链接以及代码片段: 虽然这很好,但我很乐意将资源和样式移到更好的位置(样式表之类的)。我的第一次尝试是将标记移动到,但这不起作用。我尝试了几种不同的方法,但都没有成功。下面是一个我有点期待成功的尝试示例: <!-- Doesn't work as expected: --> <Window.Res

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


虽然这很好,但我很乐意将资源和样式移到更好的位置(样式表之类的)。我的第一次尝试是将
标记移动到
,但这不起作用。我尝试了几种不同的方法,但都没有成功。下面是一个我有点期待成功的尝试示例:

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

搜索web和msdn并没有帮助我解决问题,而是给我留下了第二个(相关)问题:实际上什么是选项卡面板,它与选项卡控件有什么关系

任何帮助和提示都将不胜感激


(已编辑:在上一个示例中评论说该代码不适用于我。)

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

我还不太熟悉ControlTemplates。我从以下方面破解了这个示例:


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


我很想知道为什么将样式放在窗口资源部分不起作用。我最初的反应是,在我尝试之前,它应该是有效的。我将此添加为答案,因为SO不允许我在评论中添加图像。

谢谢Chris的建议。我看到过这样的示例,但这似乎需要很多代码来更改tabheaders的一个布局属性,因为它会让您创建整个ControlTemplate。也许一位大师可以提出另一种意见,告诉我们这是否是一条路?我知道你的意思:)我一直在尝试改变扩展器的外观,这不是一个简单的过程。所以我也希望有人有更好的方法:)“我最初的反应是,在我尝试之前,它应该是有效的。”啊!所以我还是清醒的:)谢谢你在标签面板NVM上的解释。有道理。我在调查中发现的一个“线索”(如果我理解正确的话)是TabPanel没有XAML(看起来)。例如,不能将
元素添加到TabControl。(编辑评论)有点晚了,但翻看我以前的问题,我发现你回答了我的一个问题。信用到期时的信用:)
<!-- Doesn't work as expected: -->
<Window.Resources>
    <Style TargetType="{x:Type TabPanel}">
        <Setter Property="HorizontalAlignment" Value="Center" />
    </Style>
</Window.Resources>
<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>