我正在寻找一种在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。
答案 0 :(得分:1)
这是使用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扩展方法。