首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于TabStripPlacement更改TabItem CornerRadius

基于TabStripPlacement更改TabItem CornerRadius
EN

Stack Overflow用户
提问于 2020-10-19 10:12:57
回答 1查看 114关注 0票数 0

有人知道如何在TabItem或TabControl中设置触发器,这些触发器将仅根据TabItem的位置/方向来改变TabItem内部边框的CornerRadius吗?下面是我想解决的问题:

您应该注意两组选项卡,左上角的选项卡带有文本"Cell Browser",底部的选项卡。查看它,您可以看到对于TabItems的旋转,底部TabItems的圆角半径是不正确的。它们是反转的,而它们应该是向下的。有人知道如何根据标签条的位置更改TabItems的拐角半径吗?我已经意识到,我可以为每个特定的方向创建不同的样式,比如当放置位置是左侧、底部等时,我宁愿只有一个样式,如果可能的话。

看看下面的xaml,在tabitem声明中有一个边框,简称为“边框”。这就是我希望通过触发器改变的东西。我只是不知道如何从tabcontrol样式访问它,或者选择从tabitem样式触发器中执行相同的操作,并以某种方式检测当前方向。

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2020-10-19 15:43:27

TabStripPlacement设置为Bottom时,CornerRadius错误。这样做的原因是,标题面板在这种情况下不会旋转,因为此时内容将颠倒显示。

可以向TabItem控件模板添加触发器,从而根据触发器翻转拐角半径。TabStripPlacement属性在TabControlTabItem上都可用。

代码语言:javascript
复制
<Trigger Property="TabStripPlacement" Value="{x:Static Dock.Bottom}">
   <Setter TargetName="Border" Property="CornerRadius" Value="0,0,1,1"/>
</Trigger>

另一种方法是将Border旋转180°以使拐角半径正确,然后将其ContentSite旋转180°以使其旋转反转且不会颠倒显示。

代码语言:javascript
复制
<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部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64420252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档