问题:我有一些UCControl而不是设计几何形状。我可以在运行时配置尺寸(尺寸和笔划粗细),颜色(背景和笔划),所有工作都很好,直到我使用纯色。如果我使用,对于笔划,透明刷子出现问题:形状显示正确的尺寸和颜色,但strokethikness是减半。
<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:
<Path Fill="Red" Stroke="Black" StrokeThickness="10" StrokeDashArray="1 1">
<Path.Data>
<RectangleGeometry Rect="0,0,100,100"/>
</Path.Data>
</Path>
结果:
在这种特殊情况下,我需要使用StrokeThickness作为形状周围的边框,如果我想要边框大小为20,我需要在形状周围设置20个边框,如果颜色是纯色或透明,则无关紧要,以及形状(边框+背景)的总大小不得变异。因此,考虑如何绘制笔划(它使形状的内部偏移,对于StrokeThickness的一半,并在内部绘制半笔划,在此偏移之外的半笔划),如果笔触颜色是透明的,我只需要复制StrokeThickness。是的,它有点令人困惑,我希望它清晰而有用...这里的代码只适用于Rectangle.StrokeThickness元素:
<Rectangle.StrokeThickness>
<MultiBinding Converter="{StaticResource MyConverter}">
<Binding Path="Rectangle.Thick"></Binding>
<Binding Path="Rectangle.BorderColorBrush"></Binding>
</MultiBinding>
</Rectangle.StrokeThickness>
..and转换器只复制Rectangle.Thick值if(Rectangle.BorderColorBrush == Brushes.Transparent)。最终结果是我想要的: