WPF错误还是我疯了?

1 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

然后我画它:

using (DrawingContext drawingContext = RenderOpen())
   drawingContext.DrawGeometry(null, _pen, _pathGeometry);
Run Code Online (Sandbox Code Playgroud)

我应该看到的:

WPF应绘制一条从0到-10并返回0的垂直线.最后一部分(回到0)无法看到,因为它是在同一个x像素上绘制的.但最后一部分导致以下结果:

我所看到的:

WPF绘制一条从0到-15的行.对我来说完全是无稽之谈.每当我在另一条垂直线的顶部绘制垂直线时,就会发生这种5像素差异,如上例所示.

请有人告诉我,我犯了一个错误,这不是一个WPF错误.

mic*_*tan 5

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

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

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

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

有关StrokeLineJoin的更多信息,请参见此处.有关WPF如何呈现Mitered角落的有趣帖子,请参阅此处.