Ошибка WPF или я схожу с ума?

Я вижу странную ошибку со следующим кодом.

У меня есть PathGeometry, к которому я добавил PathFigure, чтобы добавить к нему LineSegment.

Вот что я делаю:

_pathGeometry.Figures.Add(_pathFigure);
_pathFigure.StartPoint = new Point(4, 0);
LineSegment lineSegment1 = new LineSegment(new Point(4, -10), true);
LineSegment lineSegment2 = new LineSegment(new Point(4, 0), true);
_pathFigure.Segments.Add(lineSegment1);
_pathFigure.Segments.Add(lineSegment2);

Затем я рисую это:

using (DrawingContext drawingContext = RenderOpen())
   drawingContext.DrawGeometry(null, _pen, _pathGeometry);

Что я должен увидеть:

WPF должен рисовать вертикальную линию, которая идет от 0 до -10 и обратно к 0. Последняя часть (обратно к 0) не видна, потому что она нарисована на том же x пикселе. Но последняя часть вызывает следующее:

Что я вижу:

WPF рисует линию от 0 до -15. Это не имеет никакого смысла для меня. Эта разница в 5 пикселей возникает всякий раз, когда я рисую вертикальную линию поверх другой вертикальной линии, как в предыдущем примере.

Пожалуйста, скажите мне, что я допустил ошибку и что это не ошибка WPF.


person Community    schedule 11.06.2009    source источник
comment
Что вы увидите, если вы также измените значение x?   -  person ChrisF    schedule 11.06.2009
comment
Это не имеет значения, потому что это должно быть одно и то же значение x. Причина этого в том, что это меняющаяся линия, где я не знаю, где она закончится.   -  person    schedule 11.06.2009
comment
Кстати, он правильно рисует, когда я меняю значение x. Просто в этот момент я должен быть на одном и том же пикселе.   -  person    schedule 11.06.2009


Ответы (3)


Я думаю, что проблема связана с тем, как WPF отображает «углы» на вашем пути. По мере того, как угол между двумя сегментами линии становится более острым, визуализация углов становится более очевидной.

В вашем случае у вас есть угол нулевой градус (отрезок линии, складывающийся сам по себе), что является наиболее проблематичным случаем.

Не все потеряно — есть несколько возможных решений:

  • Разделите PathFigure на два PathFigure (это ваш обходной путь). Делая это, вы удаляете угол и, следовательно, проблему.
  • Задайте для свойства StrokeLineJoin контура значение Bevel вместо Mitre (по умолчанию). Это придаст скошенный угол.
  • Уменьшите StrokeMiterLimit пути. Это сделает угол менее «заостренным», как говорят ученые.
  • Скажите LineSegment явно удалить его «угловой». Это можно сделать, установив для свойства IsSmoothJoin значение true.

Дополнительные сведения о StrokeLineJoin см. здесь. Интересный пост о том, как WPF отображает скошенные углы, см. здесь.

person micahtan    schedule 11.06.2009
comment
Я в порядке с моим обходным путем. Спасибо за все решения. Очень интересно узнать, почему это происходит и как это обойти. - person ; 16.06.2009

Если это что-то вроде GraphicsPath, вам также нужно будет установить конечную точку.

person leppie    schedule 11.06.2009

Хорошо, я нашел решение этой проблемы сам. Похоже, это ошибка WPF.

Вам нужно добавить LineSegments к отдельным PathFigures, чтобы не видеть это странное поведение:

PathFigure pathFigure1 = new PathFigure();
pathFigure1.StartPoint = new Point(4, 0);
LineSegment lineSegment1 = new LineSegment(new Point(4, -10), true);
pathFigure1.Segments.Add(lineSegment1);

PathFigure pathFigure2 = new PathFigure();
pathFigure2.StartPoint = new Point(4, -10);
LineSegment lineSegment2 = new LineSegment(new Point(4, 0), true);
pathFigure2.Segments.Add(lineSegment2);

pathGeometry.Figures.Add(pathFigure1);
pathGeometry.Figures.Add(pathFigure2);

Я все еще был бы признателен, если бы кто-нибудь мог объяснить, почему я вижу эту ошибку, если я не делаю этого таким образом, или если бы кто-то мог подтвердить, что это ошибка.

person Community    schedule 11.06.2009