使用DrawingContext.DrawLine与Adorner绘制的线是“模糊”

时间:2018-09-07 15:11:19

标签: c# .net wpf

我在WPF应用程序中使用Adorner在拖放操作中渲染放置点。该线应为黑色线,单个像素粗,但最终会变成两倍并略微呈灰色。我猜想这与WPF在亚像素级别呈现的方式有关。

使用Window托管内容的AdornerLayer已将SnapsToDevicePixels设置为true,这在过去已解决了类似问题,但似乎并非如此。完全影响Adorner

这是我得到的输出。 文字下方的2像素粗灰线应为1像素粗黑。 enter image description here

用于绘制线条的Pen定义为:

_pen = new Pen(Brushes.Black, 1);

并使用:

drawingContext.DrawLine(_pen, left, right);

AdornerLayerWindow上的默认值。如果根本不重要,则将Adorner应用于TreeView中放置的UserControl上的Window

我该怎么做才能使它呈现我想要的方式?

2 个答案:

答案 0 :(得分:0)

在尝试了各种选项之后,我发现在调用left之前将right.5偏移DrawLine可解决此问题。这似乎也证实了我的亚像素理论。

left.Offset(5, 5);
right.Offset(5, 5);
drawingContext.DrawLine(_pen, left, right);

虽然这确实可行,但我发现它是一个非常不令人满意的解决方案。我的绘图逻辑很可能会变得更复杂,并且我不想一直处理半像素偏移。

我希望其他人可以指出我的“更正确”的处理方式。

答案 1 :(得分:0)

在您的装饰师课程中,您可以尝试以下一些选项以及它们的组合...这就是我在装饰师中使用的摆脱模糊线条和模糊图标的方法:

        RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
        RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor);

        SnapsToDevicePixels = true;
        UseLayoutRounding = true;

不幸的是,有时您自己提供的答案是唯一的答案。偏移0.5,将笔刷宽度设置为1.0001等是非常常见的解决方法。 WPF尝试通过抗锯齿来提高机灵性,但对于1个像素的宽/高线和其他类型的元素,他们做得并不正确。