这是关于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有什么关系? ?
非常感谢任何帮助和提示。
(已编辑:在上一个示例中评论说代码对我不起作用。)
答案 0 :(得分:10)
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>