我正在寻找一种在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扩展方法。

10-07 16:25