WPF 边框对象边框 CornerRadius 与边框背景 CornerRadius 不同

Posted

技术标签:

【中文标题】WPF 边框对象边框 CornerRadius 与边框背景 CornerRadius 不同【英文标题】:WPF Border Object Border CornerRadius different from Border Background CornerRadius 【发布时间】:2011-10-24 08:55:18 【问题描述】:

我有两个彼此重叠的边框。一个有 BorderThickness 但没有背景,另一个没有边框粗细但有背景。两个边框的 CornerRadius 都是 3。问题是其中一个边框的背景角从另一个边框的角后面伸出。

这是 XAML,第一个边框元素具有背景,名为 FocusVisual 的边框具有 BorderThickness。

<Grid x:Name="grid">
    <Border Background="TemplateBinding Background"  
            CornerRadius="3">
        <Grid>
            <Border x:Name="MouseOverVisual" 
                Opacity="0"
                Background="StaticResource NuiFieldHoverBrush"
                CornerRadius="3" />
            <Border>
                <Grid>
                    <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" />
                    <ContentPresenter x:Name="PART_WatermarkHost" 
                          Content="TemplateBinding Watermark"
                          ContentTemplate="TemplateBinding WatermarkTemplate"
                          VerticalAlignment="TemplateBinding VerticalContentAlignment"
                          HorizontalAlignment="TemplateBinding HorizontalContentAlignment"
                          IsHitTestVisible="False"
                          Margin="TemplateBinding Padding"
                          Visibility="Collapsed"/>
                </Grid>
            </Border>
        </Grid>
    </Border>
    <Border x:Name="FocusVisual" 
            Opacity="0" 
            BorderThickness="TemplateBinding BorderThickness"
            BorderBrush="StaticResource NuiFocusBrush" 
            CornerRadius="3" />
</Grid>

CornerRadius 对 Border 对象的 Background 和 Border 具有不同的效果,这似乎是 WPF 中的一个错误。

我可以将 BorderThickness 添加到具有背景的边框并将 BorderBrush 设置为背景颜色,但这会导致该边框的子元素被 BorderThickness 推入。我可能可以通过重新排列元素来解决这个问题,但这有点痛苦,所以我想我会看看是否有人有更好的解决方法。

【问题讨论】:

您是否尝试删除包含在第一个 Border 中的 Grid 元素,看看是否有什么不同? 尝试使用 Peter Blois 在 snoopwpf.codeplex.com 的窥探来检查每个边框是否具有相同的 ActualWidth 和 ActualHeight,是否没有隐式边距或填充弄乱等等。 【参考方案1】:

您应该重新计算内边框的CornerRadius。 假设像这样一个更简单的例子:

<Border x:Name="OuterBorder" Width="50" Height="25" Background="Gray" CornerRadius="5">
    <Border x:Name="InnerBorder" BorderBrush="red" BorderThickness="4" CornerRadius="5"/>
</Border>

InnerBorder 的宽度和高度比 OuterBorder 每边的 BorderThickness/2 小,所以你应该这样计算圆弧半径:

'内边框的CornerRadius' = '外边框的CornerRadius' - '内边框的BorderThickness'/2。

在本例中,内边框的 CornerRadius 应为 3。

编辑:我认为this SO 更适合您的问题。

【讨论】:

【参考方案2】:

为深灰色边框添加透明边框,它将与蓝色边框对齐。确保它们具有相同的边框厚度。

<Grid Width="50" Height="40">
    <Border Background="Red" CornerRadius="3" BorderBrush="Transparent" BorderThickness="1">
        <TextBlock Text="Hello" VerticalAlignment="Center" HorizontalAlignment="Center"/>
    </Border>
    <Border BorderBrush="Blue" CornerRadius="3" BorderThickness="1" Background="Transparent"/>       
</Grid>

【讨论】:

以上是关于WPF 边框对象边框 CornerRadius 与边框背景 CornerRadius 不同的主要内容,如果未能解决你的问题,请参考以下文章

WPF:带有cornerRadius和Bevel的按钮模板看起来错误

2021-08-13 WPF控件专题 Border控件详解

iOS 圆角cornerRadius边框border阴影Shadow

WPF基础之StackPanel面板进行简单布局

WPF 矩形与边框:哪个性能更好?

WPF中如何在文本外面加虚线外框