WPF错误还是我疯了?

时间:2009-06-11 12:26:21

标签: c# .net wpf drawing line

我看到以下代码中最奇怪的错误。

我有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错误。

3 个答案:

答案 0 :(得分:5)

我认为这个问题与WPF如何在你的Path中呈现“角落”有关。随着两个线段之间的角度变得更加尖锐,角落渲染变得更加明显。

在你的情况下,你有一个零度角(折叠自身的线段),这是最有问题的情况。

并非所有都丢失了 - 有几种可能的解决方案:

  • 将PathFigure拆分为两个PathFigures(这是您的解决方法)。通过执行此操作,您可以删除角落,从而解决问题。
  • 将Path的StrokeLineJoin属性设置为Bevel而不是Mitre(默认值)。这将是斜角的外观。
  • 降低Path的StrokeMiterLimit。正如科学家所说,这将使角落不那么“尖锐”。
  • 告诉LineSegment明确删除它的“角落”。您可以通过将IsSmoothJoin属性设置为true来执行此操作。

有关StrokeLineJoin的更多信息,请参阅here。有关WPF如何呈现Mitered角落的有趣帖子,请参阅here

答案 1 :(得分:0)

如果它类似于GraphicsPath,您还需要设置终点。

答案 2 :(得分:0)

好的,我自己找到了解决这个问题的方法。 似乎确实是WPF错误

您需要将LineSegment添加到个人PathFigure中才能看到这种奇怪的行为:

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

如果有人能解释为什么我会看到这个错误,如果我不这样做,或者有人可以确认这是一个错误,我仍然会感激不尽。