【问题标题】:WPF Tabcontrol TabItem display issue on Windows Classic themeWindows 经典主题上的 WPF Tabcontrol TabItem 显示问题
【发布时间】:2015-05-05 16:21:18
【问题描述】:

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

我一直在使用普通 Aero 主题的 Windows 7 机器上进行开发,并且选项卡看起来不错

当我们部署给客户时,他们的机器设置为“Windows Classic”主题,标签显示为

所以它们都被“压扁”并且不显示文本。如果我将我的机器切换到 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>

我尝试设置各种模板,在各种元素上进行填充,但似乎没有任何改变 - 所以有人知道我该如何解决这个问题吗?

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

【问题讨论】:

    标签: c# wpf tabcontrol tabitem


    【解决方案1】:

    好的 - 所以最后我不得不创建一个全新的 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 度:)

    希望这可以帮助遇到此问题的其他人!

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2017-05-11
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多