Ошибка WPF или я схожу с ума? - PullRequest
1 голос
/ 11 июня 2009

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

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

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

_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.

Ответы [ 3 ]

5 голосов
/ 12 июня 2009

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

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

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

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

Для получения дополнительной информации о StrokeLineJoin см. здесь . Для интересного поста о том, как WPF рендерит Mitered углы, смотрите здесь .

0 голосов
/ 11 июня 2009

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

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

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);

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

0 голосов
/ 11 июня 2009

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

...