我正在寻找一种在xaml中为StreamGeometry创建非描边区域的方法。
换句话说,我想知道是否可以使用StreamGeometry Xaml标记语法重新创建以下代码(取自msdn)。
StreamGeometry geometry = new StreamGeometry();
geometry.FillRule = FillRule.EvenOdd;
using (StreamGeometryContext ctx = geometry.Open())
{
ctx.BeginFigure(new Point(10, 100), true /* is filled */, true /* is closed */);
ctx.LineTo(new Point(100, 100), false/* is not stroked */, false /* is smooth join */);
ctx.LineTo(new Point(100, 50), true /* is stroked */, false /* is smooth join */);
}
我正在寻找一种在WPF中可以使用的解决方案,因为Silverlight没有StreamGeometry。
最佳答案
这是使用PathGeometry的直接翻译:
<PathGeometry FillRule="EvenOdd">
<PathFigure StartPoint="10,100" IsFilled="true" IsClosed="true">
<LineSegment Point="100,100" IsStroked="false" IsSmoothJoin="false" />
<LineSegment Point="100,50" IsStroked="true" IsSmoothJoin="false" />
</PathFigure>
</PathGeometry>
可以通过省略FillRule,IsFilled,IsStroked和IsSmoothJoin的默认值来简化此操作,从而得到:
<PathGeometry>
<PathFigure StartPoint="10,100" IsClosed="true">
<LineSegment Point="100,100" IsStroked="false" />
<LineSegment Point="100,50" />
</PathFigure>
</PathGeometry>
这必须使用PathGeometry而不是几何迷你语言(例如“ M10,100 L100,100 100,50”)完成,因为该迷你语言无法设置IsStroked = false。
由于需要StreamGeometry,因此建议您在this answer中使用
GeometryExtensions.DrawGeometry
方法将XAML中定义的PathGeometry转换为StreamGeometry。我倾向于使用标记扩展来做到这一点:
<local:ConvertToStreamGeometry>
<PathGeometry>
<PathFigure StartPoint="10,100" IsClosed="true">
<LineSegment Point="100,100" IsStroked="false" />
<LineSegment Point="100,50" />
</PathFigure>
</PathGeometry>
</local:ConvertToStreamGeometry>
标记扩展的实现很简单:
[ContentProperty("Geometry")]
public class ConvertToStreamGeometry : MarkupExtension
{
public Geometry Geometry { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var result = new StreamGeometry();
using(var ctx = result.Open())
ctx.DrawGeometry(Geometry);
return result;
}
}
请注意,这会从my earlier answer中的代码调用GeometryExtensions.DrawGeometry扩展方法。