Создание области без штрихов в C # StreamGeometry Xaml разметка - PullRequest
2 голосов
/ 28 июня 2010

Я ищу способ создания областей без штрихов для StreamGeometry в xaml.

Другими словами, я хочу знать, возможно ли воссоздать следующий код (взятый из msdn ) с синтаксисом разметки StreamGeometry Xaml.

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.

1 Ответ

1 голос
/ 30 июня 2010

Вот прямой перевод с использованием 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, я рекомендую использовать метод GeometryExtensions.DrawGeometry в этом ответе для преобразования PathGeometry, определенного в XAML, в 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;
  }
}

Обратите внимание, что это вызывает метод расширения GeometryExtensions.DrawGeometry из кода в моем предыдущем ответе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...