c# - WPF 错误还是我要疯了?

标签 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 错误。

最佳答案

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

在你的例子中,你有一个零度角(一条线段自身折回),这是最有问题的情况。

并非一切都丢失了——有几种可能的解决方案:

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

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

关于c# - WPF 错误还是我要疯了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980798/

相关文章:

c# - 如何摆脱 WPF MVVM View 模型中的重复属性

.net - 基于POCO的多层.NET框架

c# - .NET 3.5 上的单声道 GetText

c# - For 循环填充文本 block

WPF 预渲染一个列表而不实际显示它

c# - Linq to XML - 字典转换

c# - 两个不同的程序集版本 "The located assembly' 的 list 定义与程序集引用不匹配”

c# - Entity Framework 如何在其他查询失败时恢复已执行的查询

.net - VS2008 - 为版本号添加字母(即 1.1.1.12-Dev)

c# - 使用转换器将窗口标题绑定(bind)到属性