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

Adorner在 WPF 应用程序中使用一个在拖放操作中呈现放置点。这条线应该是一条黑线,一个像素粗,但它最终会变成两倍并略带灰色。我猜这在某种程度上与 WPF 在子像素级别的渲染方式有关。

使用 的Window托管内容AdornerLayerSnapsToDevicePixels设置为true,这在过去解决了类似的问题,但似乎根本没有影响Adorner

这是我得到的输出。文本下方 2 像素粗的灰线为 1 像素粗和黑色:

http://img.mukewang.com/61da40dd0001bdfc07930202.jpg

Pen用于绘制线定义与:

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

并使用以下方法绘制:

drawingContext.DrawLine(_pen, left, right);

AdornerLayer存在于默认的Window。如果这很重要,则将Adorner应用于 a TreeViewon aUserControl放置在Window.

我需要做些什么才能让它以我想要的方式呈现?


慕勒3428872
浏览 219回答 2
2回答

慕运维8079593

在您的装饰器类中,您可以尝试其中一些选项和它们的组合......这就是我在装饰器中使用的来消除模糊线条和模糊图标:        RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);        RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor);        SnapsToDevicePixels = true;        UseLayoutRounding = true;不幸的是,您自己提供的答案有时是唯一的答案。偏移 0.5,将画笔宽度设置为 1.0001 等是非常常见的解决方法。WPF 试图通过抗锯齿来变得聪明,但是对于 1 像素宽度/高度线和其他类型的元素,它们并没有做到这一点。

慕桂英3389331

玩弄各种选项后,我发现,抵消left并right通过.5调用之前DrawLine修复这个问题。这似乎也印证了我的亚像素理论。left.Offset(5, 5);right.Offset(5, 5);drawingContext.DrawLine(_pen, left, right);虽然这确实有效,但我发现它是一个非常不令人满意的解决方案。我的绘图逻辑很可能会变得更复杂,我不想经常处理半像素偏移。我希望其他人可以为我指出一种“更正确”的处理方式。
打开App,查看更多内容
随时随地看视频慕课网APP