答案 0 :(得分:3)
您需要使用FillRule。 Path Mini-Language页面还会显示使用方法。
FillRule
指定路径是使用EvenOdd还是NonZero填充规则值:
F0 指定EvenOdd填充规则 F1 指定非零填充规则。如果省略此命令,则路径使用默认行为,即EvenOdd。如果指定此命令,则必须将其放在首位。
<Path x:Name="CheckIcon"
Width="{TemplateBinding Width, Converter={StaticResource mathConverter}, ConverterParameter=*2/3-20}"
Height="{TemplateBinding Height, Converter={StaticResource mathConverter}, ConverterParameter=*2/3-20}"
Margin="1,1,0,1.5"
Opacity="1"
Stretch="Fill"
Fill="Silver"
Data="M 0,.2 L .2,0 L .5,.3 L .8,0 L 1,.2 L .7,.5 L 1,.8 L .8,1 L .5,.7 L .2,1 L 0,.8 L .3,.5 Z"
/>
还有另一种更繁琐的方法,那就是使整个十字架成为一个多边形。这意味着您需要对交叉区域的点进行数学计算。幸运的是,对我来说,不幸的是,我做了所有的数学,所以在这里。 (P.S.我不敢相信我做了所有那些罪/ cos的事情大声笑!)
{{1}}
我没试过。如果有效,请告诉我。
答案 1 :(得分:1)
在FillRule不允许填充来自两个几何的重叠区域的情况下,可以一次使用CombinedGeometry来一次描述Path.Data属性:
<Path Width="100" Height="100" Stretch="Uniform" Fill="Silver">
<Path.Data>
<CombinedGeometry>
<CombinedGeometry.Geometry1>
<PathGeometry>
<!-- First part of the cross -->
<PathFigure>
<PolyLineSegment Points=".2,0 1,.8 .8,1 0,.2 .2,0"/>
</PathFigure>
</PathGeometry>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<PathGeometry>
<!-- Second part of the cross -->
<PathFigure>
<PolyLineSegment Points=".8,0 0,.8 .2,1 1,.2 .8,0"/>
</PathFigure>
</PathGeometry>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
默认情况下,通过执行并集将两个几何合并在一起,但是如果需要其他操作,可以指定GeometryCombineMode 。 结果:
但是在有疑问的情况下,图形是特殊的(两行交叉),可以通过使用stroke属性而不是fill属性来获得,这也简化了点集本身:
<Path Width="107.1" Height="107.1" Stretch="Uniform" Stroke="Silver" StrokeThickness="28.3">
<Path.Data>
<GeometryGroup>
<LineGeometry StartPoint=".1,.1" EndPoint=".9,.9"/>
<LineGeometry StartPoint=".9,.1" EndPoint=".1,.9"/>
</GeometryGroup>
</Path.Data>
</Path>
结果是相同的,这可以通过使用迷你语言进一步简化:
<Path Width="107.1" Height="107.1" Stretch="Uniform" Stroke="Silver" StrokeThickness="28.3"
Data="M .1,.1 L .9,.9 M .9,.1 L .1,.9"/>
宽度,高度和笔触粗细的值已进行了调整(使用毕达哥拉斯),因为当使用线而不是问题矩形时,这些线使用矩形边的中间点。