绘制一个 WPF 形状,作为一个矩形:如果 Stroke 是透明的,则 StrokeThickness 减半

Drawing a WPF shape, as a Rectangle: StrokeThickness halve if Stroke is Transparent

问题:我有一些UCControl比设计几何形状。我可以在运行时配置尺寸(大小和描边粗细)、颜色(背景和描边)并且在我使用纯色之前一切正常。 如果我对描边使用透明画笔,就会出现问题:形状显示的尺寸和颜色正确,但描边度减半。

<Grid x:Name="_grid" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Rectangle Grid.Row="0" Grid.Column="0" Margin="0,0,0,0"
        Width="{Binding ActualWidth, ElementName=_grid}"
        Height="{Binding ActualHeight, ElementName=_grid}" 
        Stroke="{Binding Rectangle.BorderColorBrush}"
        StrokeThickness="{Binding Rectangle.Thick}" 
        Fill="{Binding Rectangle.BackgroundBrush}"/>

</Grid>

我需要笔划是纯色还是透明,绘制时笔划粗细是一样的。我此时发现:棕色是背景色,黑色或透明是描边。两者的 StrokeThickness 均为 20(请参阅点网格:距离为 10)

矩形或椭圆元素的 StrokeThickness 影响其总宽度和高度,而底层几何体的实际轮廓位于笔划的中心。当您使用像

这样的虚线笔划时,这会变得非常明显
<Rectangle Width="100" Height="100" Fill="Red" Stroke="Black"
           StrokeThickness="10" StrokeDashArray="1 1"/>

结果是:

填充区域的大小只有 90 x 90。

对于恰好是您想要大小的填充区域,使用带有 RectangleGeometry 的路径:

<Path Fill="Red" Stroke="Black" StrokeThickness="10" StrokeDashArray="1 1">
    <Path.Data>
        <RectangleGeometry Rect="0,0,100,100"/>
    </Path.Data>
</Path>

结果:

在这种特殊情况下,我需要使用 StrokeThickness 作为形状周围的边框,如果我想要边框大小为 20,我需要形状周围的所有边框为 20,如果颜色是纯色则无关紧要,或透明,形状的总大小(边框 + 背景)不得发生变化。 因此,考虑到 Stroke 的绘制方式(它对形状进行内部偏移,为 StrokeThickness 的一半,并在内部绘制一半笔划,在该偏移量之外绘制一半笔划)如果笔划颜色为透明,我只需要复制 StrokeThickness。是的,它有点令人困惑,我希望它是清晰和有用的......这里的代码仅用于 Rectangle.StrokeThickness 元素:

<Rectangle.StrokeThickness>
    <MultiBinding Converter="{StaticResource MyConverter}">
        <Binding Path="Rectangle.Thick"></Binding>
        <Binding Path="Rectangle.BorderColorBrush"></Binding>
    </MultiBinding>
</Rectangle.StrokeThickness>

..如果 (Rectangle.BorderColorBrush == Brushes.Transparent),转换器只是复制 Rectangle.Thick 值。 最后的结果就是我想要的: