【问题标题】:How to change UWP TabViewItem corner radius?如何更改 UWP TabViewItem 角半径?
【发布时间】:2020-08-09 16:09:15
【问题描述】:

我想更改TabViewItem 的默认圆角半径。使用默认圆角半径,它看起来像这样:

但我希望它有锋利的边缘,这意味着将CornerRadius 设置为零。像这样:

我尝试将TabViewCornerRadius 设置为零。我也尝试过像这样使用ItemTemplate

<winui:TabView.TabItemTemplate>
    <DataTemplate x:DataType="viewmodels:ShapelistViewModel">
        <winui:TabViewItem
            CornerRadius="0"
            Header="{Binding}" />
    </DataTemplate>
</winui:TabView.TabItemTemplate>

他们都没有工作。

最后,我尝试编辑TabViewTemplate,但在模板中没有找到与CornerRadius相关的任何内容。

【问题讨论】:

  • 您好,TabView项的CornerRadiusTabViewItem的默认样式决定。这是source code。您可以根据需要对其进行修改。如果您希望WinUI添加相关设置,请在Github提交您的需求

标签: uwp uwp-xaml


【解决方案1】:

WinUI TabViewItems 根据 OverlayCornerRadius 主题资源确定其 CornerRadius。要更改所有 TabViewItems 的圆角半径,您可以执行以下操作:

<!-- In App.xaml -->
<CornerRadius x:Key="OverlayCornerRadius">0,0,0,0</CornerRadius>

<!-- On your page -->
<winui:TabView.TabItemTemplate>
    <DataTemplate x:DataType="viewmodels:ShapelistViewModel">
        <winui:TabViewItem
            Header="{Binding}">
        </winui:TabViewItem>
    </DataTemplate>
</winui:TabView.TabItemTemplate>

另一种解决方案是通过将此样式放入您的 App.xaml 中来重新模板 TabViewItem:

    <Style TargetType="winui:TabViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="UseSystemFocusVisuals" Value="{StaticResource UseSystemFocusVisuals}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="winui:TabViewItem">

                    <Grid x:Name="LayoutRoot"
                        Padding="{TemplateBinding Padding}"
                        Margin="-1,0,0,0"> <!-- This item will cover the separator on its left side. -->

                        <Grid.ColumnDefinitions>
                            <ColumnDefinition x:Name="LeftColumn" Width="0"/>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition x:Name="RightColumn" Width="0"/>
                        </Grid.ColumnDefinitions>
                        
                        <Grid.RenderTransform>
                            <ScaleTransform x:Name="LayoutRootScale" />
                        </Grid.RenderTransform>

                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />

                                <VisualState x:Name="PointerOver">
                                    <VisualState.Setters>
                                        <Setter Target="TabContainer.Background" Value="{ThemeResource TabViewItemHeaderBackgroundPointerOver}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundPointerOver}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewItemIconForegroundPointerOver}" />
                                        <Setter Target="CloseButton.Background" Value="{ThemeResource TabViewItemHeaderPointerOverCloseButtonBackground}" />
                                        <Setter Target="CloseButton.Foreground" Value="{ThemeResource TabViewItemHeaderPointerOverCloseButtonForeground}" />
                                    </VisualState.Setters>
                                </VisualState>

                                <VisualState x:Name="Pressed">
                                    <VisualState.Setters>
                                        <Setter Target="TabContainer.Background" Value="{ThemeResource TabViewItemHeaderBackgroundPressed}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundPressed}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewItemIconForegroundPressed}" />
                                        <Setter Target="CloseButton.Background" Value="{ThemeResource TabViewItemHeaderPressedCloseButtonBackground}" />
                                        <Setter Target="CloseButton.Foreground" Value="{ThemeResource TabViewItemHeaderPressedCloseButtonForeground}" />
                                    </VisualState.Setters>
                                </VisualState>

                                <VisualState x:Name="Selected">
                                    <VisualState.Setters>
                                        <Setter Target="TabContainer.Background" Value="{ThemeResource TabViewItemHeaderBackgroundSelected}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundSelected}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewItemIconForegroundSelected}" />
                                        <Setter Target="CloseButton.Background" Value="{ThemeResource TabViewItemHeaderSelectedCloseButtonBackground}" />
                                        <Setter Target="CloseButton.Foreground" Value="{ThemeResource TabViewItemHeaderSelectedCloseButtonForeground}" />
                                        <Setter Target="LayoutRoot.Background" Value="Transparent"/>
                                    </VisualState.Setters>
                                </VisualState>

                                <VisualState x:Name="PointerOverSelected">
                                    <VisualState.Setters>
                                        <Setter Target="TabContainer.Background" Value="{ThemeResource TabViewItemHeaderBackgroundSelected}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundPointerOver}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewItemIconForegroundPointerOver}" />
                                        <Setter Target="CloseButton.Background" Value="{ThemeResource TabViewItemHeaderSelectedCloseButtonBackground}" />
                                        <Setter Target="CloseButton.Foreground" Value="{ThemeResource TabViewItemHeaderSelectedCloseButtonForeground}" />
                                        <Setter Target="LayoutRoot.Background" Value="Transparent"/>
                                    </VisualState.Setters>
                                </VisualState>

                                <VisualState x:Name="PressedSelected">
                                    <VisualState.Setters>
                                        <Setter Target="TabContainer.Background" Value="{ThemeResource TabViewItemHeaderBackgroundSelected}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundPressed}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewItemIconForegroundPressed}" />
                                        <Setter Target="CloseButton.Background" Value="{ThemeResource TabViewItemHeaderSelectedCloseButtonBackground}" />
                                        <Setter Target="CloseButton.Foreground" Value="{ThemeResource TabViewItemHeaderSelectedCloseButtonForeground}" />
                                        <Setter Target="LayoutRoot.Background" Value="Transparent"/>
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="DisabledStates">
                                <VisualState x:Name="Enabled" />

                                <VisualState x:Name="Disabled">
                                    <VisualState.Setters>
                                        <Setter Target="TabContainer.Background" Value="{ThemeResource TabViewItemHeaderBackgroundDisabled}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundDisabled}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource TabViewItemHeaderForegroundDisabled}" />
                                        <Setter Target="IconControl.Foreground" Value="{ThemeResource TabViewButtonForegroundDisabled}" />
                                        <Setter Target="CloseButton.Background" Value="{ThemeResource TabViewItemHeaderDisabledCloseButtonBackground}" />
                                        <Setter Target="CloseButton.Foreground" Value="{ThemeResource TabViewItemHeaderDisabledCloseButtonForeground}" />
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="DataVirtualizationStates">
                                <VisualState x:Name="DataAvailable" />

                                <VisualState x:Name="DataPlaceholder" />
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="ReorderHintStates">
                                <VisualState x:Name="NoReorderHint" />

                                <VisualState x:Name="BottomReorderHint">
                                    <Storyboard>
                                        <DragOverThemeAnimation Direction="Bottom"
                                                    ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                                                    TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="TopReorderHint">
                                    <Storyboard>
                                        <DragOverThemeAnimation Direction="Top"
                                                    ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                                                    TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="RightReorderHint">
                                    <Storyboard>
                                        <DragOverThemeAnimation Direction="Right"
                                                    ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                                                    TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="LeftReorderHint">
                                    <Storyboard>
                                        <DragOverThemeAnimation Direction="Left"
                                                    ToOffset="{ThemeResource ListViewItemReorderHintThemeOffset}"
                                                    TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0:0:0.2"
                                          To="NoReorderHint" />
                                </VisualStateGroup.Transitions>
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="DragStates">
                                <VisualState x:Name="NotDragging" />

                                <VisualState x:Name="Dragging">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="LayoutRoot"
                                             Storyboard.TargetProperty="Opacity"
                                             To="{ThemeResource ListViewItemDragThemeOpacity}"
                                             Duration="0" />
                                        <DragItemThemeAnimation TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="DraggingTarget" />

                                <VisualState x:Name="MultipleDraggingPrimary" />

                                <VisualState x:Name="MultipleDraggingSecondary" />

                                <VisualState x:Name="DraggedPlaceholder" />

                                <VisualState x:Name="Reordering">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="LayoutRoot"
                                             Storyboard.TargetProperty="Opacity"
                                             To="{ThemeResource ListViewItemReorderThemeOpacity}"
                                             Duration="0:0:0.240" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="ReorderingTarget">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="LayoutRoot"
                                             Storyboard.TargetProperty="Opacity"
                                             To="{ThemeResource ListViewItemReorderTargetThemeOpacity}"
                                             Duration="0:0:0.240" />
                                        <DoubleAnimation Storyboard.TargetName="LayoutRootScale"
                                             Storyboard.TargetProperty="ScaleX"
                                             To="{ThemeResource ListViewItemReorderTargetThemeScale}"
                                             Duration="0:0:0.240" />
                                        <DoubleAnimation Storyboard.TargetName="LayoutRootScale"
                                             Storyboard.TargetProperty="ScaleY"
                                             To="{ThemeResource ListViewItemReorderTargetThemeScale}"
                                             Duration="0:0:0.240" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="MultipleReorderingPrimary" />

                                <VisualState x:Name="ReorderedPlaceholder">
                                    <Storyboard>
                                        <FadeOutThemeAnimation TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualState x:Name="DragOver">
                                    <Storyboard>
                                        <DropTargetItemThemeAnimation TargetName="LayoutRoot" />
                                    </Storyboard>
                                </VisualState>

                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="0:0:0.2" To="NotDragging" />
                                </VisualStateGroup.Transitions>
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="IconStates">
                                <VisualState x:Name="Icon"/>
                                <VisualState x:Name="NoIcon">
                                    <VisualState.Setters>
                                        <Setter Target="IconBox.Visibility" Value="Collapsed"/>
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="TabWidthModes">
                                <VisualState x:Name="StandardWidth"/>

                                <VisualState x:Name="Compact">
                                    <VisualState.Setters>
                                        <Setter Target="IconBox.Margin" Value="0,0,0,0"/>
                                        <Setter Target="ContentPresenter.Visibility" Value="Collapsed"/>
                                        <Setter Target="IconColumn.Width" Value="{ThemeResource TabViewItemHeaderIconSize}"/>
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="CloseIconStates">
                                <VisualState x:Name="CloseButtonVisible"/>
                                <VisualState x:Name="CloseButtonCollapsed">
                                    <VisualState.Setters>
                                        <Setter Target="CloseButton.Visibility" Value="Collapsed"/>
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>

                        <Border x:Name="TabSeparator"
                            HorizontalAlignment="Right"
                            Width="1"
                            Grid.Column="1"
                            BorderBrush="{ThemeResource TabViewItemSeparator}"
                            BorderThickness="1"
                            Margin="{ThemeResource TabViewItemSeparatorMargin}"/>

                        <Grid x:Name="TabContainer"
                            Grid.Column="1"
                            Background="{ThemeResource TabViewItemHeaderBackground}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Control.IsTemplateFocusTarget="True"
                            Padding="{ThemeResource TabViewItemHeaderPadding}"
                            FocusVisualMargin="{TemplateBinding FocusVisualMargin}">

                            <Grid.ColumnDefinitions>
                                <ColumnDefinition x:Name="IconColumn" Width="Auto" />
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>

                            <Viewbox x:Name="IconBox"
                                MaxWidth="{ThemeResource TabViewItemHeaderIconSize}"
                                MaxHeight="{ThemeResource TabViewItemHeaderIconSize}"
                                Margin="{ThemeResource TabViewItemHeaderIconMargin}">
                                <ContentControl x:Name="IconControl"
                                    Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TabViewTemplateSettings.IconElement}"
                                    IsTabStop="False"
                                    Foreground="{ThemeResource TabViewItemIconForeground}"
                                    HighContrastAdjustment="None" />
                            </Viewbox>

                            <ContentPresenter x:Name="ContentPresenter"
                                Grid.Column="1"
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                Content="{TemplateBinding Header}"
                                ContentTemplate="{TemplateBinding HeaderTemplate}"
                                ContentTransitions="{TemplateBinding ContentTransitions}"
                                FontWeight="{TemplateBinding FontWeight}"
                                FontSize="{ThemeResource TabViewItemHeaderFontSize}"
                                Foreground="{ThemeResource TabViewItemHeaderForeground}"
                                OpticalMarginAlignment="TrimSideBearings"
                                HighContrastAdjustment="None" />

                            <Button x:Name="CloseButton"
                                Grid.Column="2"
                                Width="{ThemeResource TabViewItemHeaderCloseButtonSize}"
                                Height="{ThemeResource TabViewItemHeaderCloseButtonSize}"
                                FontSize="{ThemeResource TabViewItemHeaderCloseFontSize}"
                                Margin="{ThemeResource TabViewItemHeaderCloseMargin}"
                                Content="&#xE711;"
                                IsTextScaleFactorEnabled="False"
                                IsTabStop="False"
                                Background="{ThemeResource TabViewItemHeaderCloseButtonBackground}"
                                Foreground="{ThemeResource TabViewItemHeaderCloseButtonForeground}"
                                Style="{StaticResource TabViewCloseButtonStyle}"
                                HighContrastAdjustment="None" />
                        </Grid>
                    </Grid>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

【讨论】:

  • 嗨,我刚试过。拐角半径仍然存在。但是,@Richard 指出的模板很有帮助,我能够以这种方式解决它。
  • 这真的很奇怪。我已经在 WinUI 测试应用程序中尝试过了,它似乎可以工作。也许这是其他应用程序的问题?
  • 我第一次在 XAML Studio 中尝试过,没有用。然后在测试 UWP 应用程序中,结果相同。在此处查看代码:gist.github.com/MuziburRahman/2c11ef51d74cbe75484dea38853dd73d
  • 这可能是一个错误,我在 WinUI repo 上为此创建了一个问题:github.com/microsoft/microsoft-ui-xaml/issues/3083 同时,您可以重新模板,尽管您似乎已经找到了解决方案。跨度>
猜你喜欢
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2022-01-03
  • 2022-10-13
  • 2014-07-07
  • 1970-01-01
相关资源
最近更新 更多