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 度:)
希望这对遇到此问题的其他人有所帮助!!
我在 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 度:)
希望这对遇到此问题的其他人有所帮助!!