wpf - 根据 TabStripPlacement 更改 TabItem CornerRadius
问题描述
有谁知道如何在 TabItem 或 TabControl 中设置触发器,这将改变 TabItem 内部边框的 CornerRadius,仅基于 TabItem 的放置/方向?这是我要修复的图片:
您应该注意两组选项卡,左上一组带有文本“单元格浏览器”,底部一组。查看它,您可以看到底部 TabItems 的角半径对于 TabItems 的旋转是不正确的。当它们应该向下时,它们是倒置的。有谁知道如何根据标签条位置更改 TabItems 的角半径?我已经知道我可以为每个特定方向创建不同的样式,例如当位置为左、下等时的样式。但是,如果可能的话,我宁愿只有一个。
查看下面的 xaml,在 tabitem 声明中有一个边框,简称为“边框”。这就是我希望通过触发器来改变的。我只是不知道如何从 tabcontrol 样式访问它,或者可选地,从 tabitem 样式触发器中执行相同操作并以某种方式检测当前方向。
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VoidwalkerEngine.Editor.Resources.Themes.Styles">
<Style x:Key="VoidwalkerTabControlStyle" TargetType="{x:Type TabControl}">
<Setter Property="Padding" Value="2" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="BorderBrush" Value="#3f3f46" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabControl}">
<Grid
x:Name="templateRoot"
Background="#181818"
ClipToBounds="true"
KeyboardNavigation.TabNavigation="Local"
SnapsToDevicePixels="true">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="ColumnDefinition0" />
<ColumnDefinition x:Name="ColumnDefinition1" Width="0" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition x:Name="RowDefinition0" Height="Auto" />
<RowDefinition x:Name="RowDefinition1" Height="*" />
</Grid.RowDefinitions>
<TabPanel
x:Name="headerPanel"
Grid.Row="0"
Grid.Column="0"
Margin="0"
Panel.ZIndex="1"
Background="Transparent"
IsItemsHost="true"
KeyboardNavigation.TabIndex="1" />
<Border
x:Name="contentPanel"
Grid.Row="1"
Grid.Column="0"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
KeyboardNavigation.DirectionalNavigation="Contained"
KeyboardNavigation.TabIndex="2"
KeyboardNavigation.TabNavigation="Local">
<ContentPresenter
x:Name="PART_SelectedContentHost"
Margin="0"
ContentSource="SelectedContent"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="TabStripPlacement" Value="Bottom">
<Setter TargetName="headerPanel" Property="Grid.Row" Value="1" />
<Setter TargetName="contentPanel" Property="Grid.Row" Value="0" />
<Setter TargetName="RowDefinition0" Property="Height" Value="*" />
<Setter TargetName="RowDefinition1" Property="Height" Value="Auto" />
<Setter TargetName="headerPanel" Property="Margin" Value="0" />
</Trigger>
<Trigger Property="TabStripPlacement" Value="Left">
<Setter TargetName="headerPanel" Property="Grid.Row" Value="0" />
<Setter TargetName="contentPanel" Property="Grid.Row" Value="0" />
<Setter TargetName="headerPanel" Property="Grid.Column" Value="0" />
<Setter TargetName="contentPanel" Property="Grid.Column" Value="1" />
<Setter TargetName="ColumnDefinition0" Property="Width" Value="Auto" />
<Setter TargetName="ColumnDefinition1" Property="Width" Value="*" />
<Setter TargetName="RowDefinition0" Property="Height" Value="*" />
<Setter TargetName="RowDefinition1" Property="Height" Value="0" />
<Setter TargetName="headerPanel" Property="Margin" Value="0" />
<Setter TargetName="headerPanel" Property="VerticalAlignment" Value="Top" />
<Setter TargetName="headerPanel" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="270" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="TabStripPlacement" Value="Right">
<Setter TargetName="headerPanel" Property="Grid.Row" Value="0" />
<Setter TargetName="contentPanel" Property="Grid.Row" Value="0" />
<Setter TargetName="headerPanel" Property="Grid.Column" Value="1" />
<Setter TargetName="contentPanel" Property="Grid.Column" Value="0" />
<Setter TargetName="ColumnDefinition0" Property="Width" Value="*" />
<Setter TargetName="ColumnDefinition1" Property="Width" Value="Auto" />
<Setter TargetName="RowDefinition0" Property="Height" Value="*" />
<Setter TargetName="RowDefinition1" Property="Height" Value="0" />
<Setter TargetName="headerPanel" Property="Margin" Value="0" />
<Setter TargetName="headerPanel" Property="VerticalAlignment" Value="Top" />
<Setter TargetName="headerPanel" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="90" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="templateRoot" Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="VoidwalkerTabItemStyle" TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid x:Name="Root">
<Border
x:Name="Border"
Margin="0"
Background="Yellow"
BorderBrush="Red"
BorderThickness="1,1,1,0"
CornerRadius="1,1,0,0">
<TextBlock
x:Name="ContentSite"
Margin="12,2,12,2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{TemplateBinding Header}" />
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger SourceName="ContentSite" Property="IsMouseOver" Value="True">
<Setter TargetName="ContentSite" Property="Foreground" Value="{DynamicResource GlobalAccentSolidColorBrush}" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="100" />
<Setter TargetName="Border" Property="Background" Value="#444444" />
<Setter TargetName="Border" Property="BorderBrush" Value="#444444" />
<Setter Property="Foreground" Value="#eeeeee" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter Property="Foreground" Value="#a4a4a4" />
<Setter TargetName="Border" Property="Background" Value="#373737" />
<Setter TargetName="Border" Property="BorderBrush" Value="#2b2b2b" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
解决方案
设置为CornerRadius
时是错误的。这样做的原因是在这种情况下标题面板不会旋转,因为那时内容会倒置显示。TabStripPlacement
Bottom
您可以向TabItem
控件模板添加触发器,该触发器会根据该模板翻转角半径。该TabStripPlacement
属性适用于TabControl
和TabItem
。
<Trigger Property="TabStripPlacement" Value="{x:Static Dock.Bottom}">
<Setter TargetName="Border" Property="CornerRadius" Value="0,0,1,1"/>
</Trigger>
另一种方法是旋转Border
180° 以使圆角半径正确,然后将其旋转ContentSite
180° 以使其旋转反转并且不会倒置显示。
<Trigger Property="TabStripPlacement" Value="Bottom">
<Setter TargetName="Border" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="180"/>
</Setter.Value>
</Setter>
<Setter TargetName="ContentSite" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="180"/>
</Setter.Value>
</Setter>
</Trigger>
将两个替代触发器中的任何一个粘贴到TabItem
控件模板Triggers
部分。
推荐阅读
- ios - UIStackView 作为具有居中对齐内容的 flexbox
- python - python 错误:应用 ARIMA.fit 时的 memoryError 高阶 q=367 用于 MA
- batch-file - 什么环境问题导致批处理文件功能无法正常工作
- javascript - 停止/退出 node.js 路由的正确方法是什么?
- windows - 我可以远程访问 Windows Server 2016 上的 IIS 吗?
- flutter - 突出显示 DropdownButton 中的选定值(如 PopupMenuButton)
- javascript - JavaScript Executor Click 在 Internet Explorer 上无法正常工作,除非 IE 11 被重置和恢复并重新启动计算机
- c - 如何在 C 中演示 fork() 的不可预测顺序?
- excel - 在下拉列表选项上创建空白选项
- c# - 如何将整数数组(1和0)转换为c#中的ascii等价物