1

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

我有一个PathGeometry我添加了 aPathFigure以便我可以添加LineSegments 到它。

这就是我所做的:

_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 错误。

4

3 回答 3

5

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

在您的情况下,您有一个零度角(一条线段自行折回),这是最有问题的情况。

并非全部丢失 - 有几种可能的解决方案:

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

有关 StrokeLineJoin 的更多信息,请参见此处。有关 WPF 如何渲染斜接角的有趣帖子,请参见此处

于 2009-06-11T20:42:19.260 回答
0

如果是类似的GraphicsPath,您也需要设置终点。

于 2009-06-11T12:35:48.693 回答
0

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

您需要将LineSegments 添加到 individual 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);

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

于 2009-06-11T14:15:09.640 回答