private/styles/Set-TabControlStyle.ps1

<#
.SYNOPSIS
    Applies themed styling to a TabControl with fixed tab row positions.
#>

function Set-TabControlStyle {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Windows.Controls.TabControl]$TabControl
    )

    # Custom TabControl template that uses WrapPanel instead of TabPanel
    # WrapPanel doesn't reorder rows when a tab is selected
    # Uses DynamicResource for theme-aware colors
    $xaml = @"
<ControlTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 TargetType="TabControl">
    <Grid KeyboardNavigation.TabNavigation="Local">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
 
        <!-- Tab header area using WrapPanel for stable row positions -->
        <Border Grid.Row="0"
                BorderBrush="{DynamicResource BorderBrush}"
                BorderThickness="0,0,0,1"
                Background="Transparent">
            <WrapPanel x:Name="HeaderPanel"
                       IsItemsHost="True"
                       HorizontalAlignment="Left"
                       Margin="8,0,0,0"
                       KeyboardNavigation.TabIndex="1"/>
        </Border>
 
        <!-- Content area -->
        <Border x:Name="ContentPanel"
                Grid.Row="1"
                Background="{DynamicResource WindowBackgroundBrush}"
                BorderBrush="{DynamicResource BorderBrush}"
                BorderThickness="0"
                KeyboardNavigation.TabNavigation="Local"
                KeyboardNavigation.DirectionalNavigation="Contained"
                KeyboardNavigation.TabIndex="2">
            <ContentPresenter x:Name="PART_SelectedContentHost"
                              ContentSource="SelectedContent"
                              Margin="0"/>
        </Border>
    </Grid>
</ControlTemplate>
"@


    # Check the alignment of the tab header, so it can be restored after the switch
    $oldPanel  = if ($TabControl.Template) { $TabControl.Template.FindName('HeaderPanel', $TabControl) }
    $alignment = if ($oldPanel) { $oldPanel.HorizontalAlignment }

    try { $TabControl.Template = [System.Windows.Markup.XamlReader]::Parse($xaml) }
    catch { Write-Verbose "Failed to apply TabControl template: $_" }

    if ($null -ne $alignment -and $TabControl.ApplyTemplate()) {
        $newPanel = $TabControl.Template.FindName('HeaderPanel', $TabControl)
        if ($newPanel) { $newPanel.HorizontalAlignment = $alignment }
    }
}