Windows 经典主题上的 WPF Tabcontrol TabItem 显示问题

WPF Tabcontrol TabItem display issue on Windows Classic theme

我在 WPF 开发 (.net 3.5 sp1) 中遇到了一个恼人的问题,我一直在处理这个问题,它涉及在我的界面上显示一些标签(并旋转)。

我一直在使用普通 Aero 主题的 Windows 7 机器上进行开发,标签看起来不错

当我们部署给客户时,他们的机器设置为 "Windows Classic" 主题,选项卡显示为

所以都是'squashed',不显示文字。如果我将我的机器切换到 Windows Classic,那么我就可以重现。我查看了 WPF Inspector 的界面,可以看到一些不应该存在的填充值

如果我使用 WPF Inspector 将填充值更改为 0,那么选项卡将再次开始正确显示!!我已经在我的模板上将填充设置为 0,但它似乎没有任何影响

    <TabControl TabStripPlacement="Left"
            SelectedIndex="{Binding CurrentTabIndex}"
            ItemsSource="{Binding CurrentPassengers}">
    <TabControl.Resources>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Padding"
                    Value="0" />
            <Setter Property="Margin"
                    Value="0" />
            <Setter Property="Width"
                    Value="26.5" />
            <Setter Property="HeaderTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <ContentPresenter Content="{Binding NameInGDSFormat}">
                            <ContentPresenter.LayoutTransform>
                                <RotateTransform Angle="-90" />
                            </ContentPresenter.LayoutTransform>
                        </ContentPresenter>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </TabControl.Resources>
    <TabControl.ContentTemplate>
        <!-- Lots of stuff in here for the Content Template -->
    </TabControl.ContentTemplate>
</TabControl>

我试过设置各种模板,填充各种元素,但似乎没有任何改变 - 那么有人知道我该如何解决这个问题吗?

编辑:如果我删除设置的 'width',那么它实际上会显示在 Windows 经典中 - 但选项卡非常宽。

好的 - 所以最后我不得不创建一个全新的 ControlTemplate 来解决这个问题:)

基本上我在原来的Classic ControlTemplate中找到了以下内容

<ContentPresenter RecognizesAccessKey="True"
     Content="{TemplateBindingReaderedContentControl.Header}"
     ContentTemplate="{TemplateBinding HeaderedContentControl.HeaderTemplate}"
     ContentStringFormat="{TemplateBinding HeaderedContentControl.HeaderStringFormat}"
     ContentSource="Header"
     HorizontalAlignment="Stretch"
     VerticalAlignment="Stretch"
     Margin="{TemplateBinding Control.Padding}"
     SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />

所以有人认为将 Margin 绑定到 Padding 是个好主意,然后当您将 Tabs 放在左侧(或右侧)时,进一步添加模板

<MultiTrigger>
        <MultiTrigger.Conditions>
            <Condition Property="Selector.IsSelected">
                <Condition.Value>
                    <s:Boolean>True</s:Boolean>
                </Condition.Value>
            </Condition>
            <Condition Property="TabItem.TabStripPlacement" Value="{x:Static Dock.Left}"/>
        </MultiTrigger.Conditions>
        <Setter Property="Control.Padding">
            <Setter.Value>
                <Thickness>11,2,14,2</Thickness>
            </Setter.Value>
        </Setter>
        <Setter Property="FrameworkElement.Margin">
            <Setter.Value>
                <Thickness>-2,-2,-2,-2</Thickness>
            </Setter.Value>
        </Setter>
    </MultiTrigger>

所以他们将 Padding 设置为 11,2,14,2(我在 WPF Inspector 中看到的值)。

所以我不得不覆盖模板,将边距设置为合理的值,然后将填充设置为更实际的值,以处理内容呈现器旋转​​ 270 度:)

希望这对遇到此问题的其他人有所帮助!!