Это будет включать в себя пользовательский шаблон ControlTemplate для TabControl.Я попробовал пример с использованием DockPanel в качестве хоста элементов, а не TabPanel по умолчанию.
<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>
<DockPanel Name="HeaderPanel"
LastChildFill="False"
Grid.Row="0"
Panel.ZIndex="1"
Margin="0,0,4,-1"
IsItemsHost="True"
KeyboardNavigation.TabIndex="1"
Background="Transparent" />
<Border Name="Border"
Grid.Row="1"
Background="WhiteSmoke"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="2"
KeyboardNavigation.TabNavigation="Local"
KeyboardNavigation.DirectionalNavigation="Contained"
KeyboardNavigation.TabIndex="2">
<ContentPresenter Name="PART_SelectedContentHost"
Margin="4"
ContentSource="SelectedContent" />
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Проблема в том, что я не знаю, как открыть свойство DockPanel.Dock для TabItems за пределамиControlTemplate EG
<TabControl Margin="10">
<TabItem Header="Tab One" DockPanel.Dock="Left"/>
<TabItem Header="Tab Two" DocKPanel.Dock="Left"/>
<TabItem Header="Tab Three" DocKPanel.Dock="Left"/>
<TabItem Header="Tab Four" DocKPanel.Dock="Right"/>
</TabControl>
// Note: This does not work!!
Полагаю, вам нужно написать собственную Panel для размещения TabItems;Обратите внимание, что это будет довольно много работы, так как вам нужно будет обрабатывать такие вещи, как поведение переполнения, встроенное в TabPanel.
Даже если вы попытались это сделать, я думаю, вам придется написать пользовательский TabControl , если вы хотите раскрыть эту функциональность вне ControlTemplate.
Если вы хотите пойти по этому пути, посмотрите мой ответ в этой записи