绘制一个 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 值。
最后的结果就是我想要的:
问题:我有一些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 值。 最后的结果就是我想要的: