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

问题描述 投票:0回答:2

我在WPF应用程序中使用Adorner来在拖放操作中渲染拖放点。该线条应为黑色线条,单个像素厚,但最终会变倍并呈灰色。我猜这与WPF在子像素级渲染的方式有某种关系。

使用Window主持内容的AdornerLayerSnapsToDevicePixels设置为true,过去曾修复类似的问题,但它似乎根本没有影响Adorner

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

用于绘制线的Pen定义为:

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

并使用:

drawingContext.DrawLine(_pen, left, right);

AdornerLayerWindow上的默认值。如果它完全重要,Adorner将被应用于放置在TreeViewUserControl上的Window

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

c# .net wpf
2个回答
0
投票

在玩了各种选项后,我发现left在调用right之前抵消.5DrawLine解决了这个问题。这似乎也证实了我的亚像素理论。

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

虽然这确实有效,但我觉得这是一个非常不满意的解决方案。我的绘图逻辑很可能变得更复杂,我不想经常处理半像素偏移。

我希望其他人可以指出我采用“更正确”的方式处理这个问题。


0
投票

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

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

        SnapsToDevicePixels = true;
        UseLayoutRounding = true;

不幸的是,您自己提供的答案有时是唯一的答案。偏移0.5,将画笔宽度设置为1.0001等是非常常见的解决方法。 WPF试图通过消除锯齿变得聪明,但它们并不适用于1像素宽度/高度线和其他类型的元素。

© www.soinside.com 2019 - 2024. All rights reserved.