我发现以下代码存在最奇怪的错误。
我有一个 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 错误。
最佳答案
我认为这个问题与 WPF 如何在您的路径中呈现“角”有关。随着两条线段之间的角度变得更尖锐,角落渲染变得更加明显。
在你的例子中,你有一个零度角(一条线段自身折回),这是最有问题的情况。
并非一切都丢失了——有几种可能的解决方案:
- 将 PathFigure 拆分为两个 PathFigures(这是您的解决方法)。通过这样做,您消除了角落,从而消除了问题。
- 将 Path 的 StrokeLineJoin 属性设置为 Bevel 而不是 Miter(默认值)。这将是斜角外观。
- 降低路径的 StrokeMiterLimit。正如科学家所说,这将使拐角不那么“尖锐”。
- 告诉 LineSegment 明确删除它的“角点”。您可以通过将 IsSmoothJoin 属性设置为 true 来执行此操作。
有关 StrokeLineJoin 的更多信息,请参阅 here .有关 WPF 如何呈现斜角的有趣帖子,请参阅 here .
关于c# - WPF 错误还是我要疯了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980798/