我在WPF应用程序中使用Adorner
来在拖放操作中渲染拖放点。该线条应为黑色线条,单个像素厚,但最终会变倍并呈灰色。我猜这与WPF在子像素级渲染的方式有某种关系。
使用Window
主持内容的AdornerLayer
将SnapsToDevicePixels
设置为true
,过去曾修复类似的问题,但它似乎根本没有影响Adorner
。
这是我得到的输出。文本下方的2像素粗灰线应为1像素厚和黑色:
用于绘制线的Pen
定义为:
_pen = new Pen(Brushes.Black, 1);
并使用:
drawingContext.DrawLine(_pen, left, right);
AdornerLayer
是Window
上的默认值。如果它完全重要,Adorner
将被应用于放置在TreeView
的UserControl
上的Window
。
我需要做什么才能让它呈现我想要的方式?
在玩了各种选项后,我发现left
在调用right
之前抵消.5
和DrawLine
解决了这个问题。这似乎也证实了我的亚像素理论。
left.Offset(5, 5);
right.Offset(5, 5);
drawingContext.DrawLine(_pen, left, right);
虽然这确实有效,但我觉得这是一个非常不满意的解决方案。我的绘图逻辑很可能变得更复杂,我不想经常处理半像素偏移。
我希望其他人可以指出我采用“更正确”的方式处理这个问题。
在您的装饰课程中,您可以尝试其中一些选项及其组合......这是我在装饰师中用来摆脱模糊线条和模糊图标:
RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);
RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor);
SnapsToDevicePixels = true;
UseLayoutRounding = true;
不幸的是,您自己提供的答案有时是唯一的答案。偏移0.5,将画笔宽度设置为1.0001等是非常常见的解决方法。 WPF试图通过消除锯齿变得聪明,但它们并不适用于1像素宽度/高度线和其他类型的元素。