我在WPF应用程序中使用Adorner
在拖放操作中渲染放置点。该线应为黑色线,单个像素粗,但最终会变成两倍并略微呈灰色。我猜想这与WPF在亚像素级别呈现的方式有关。
使用Window
托管内容的AdornerLayer
已将SnapsToDevicePixels
设置为true
,这在过去已解决了类似问题,但似乎并非如此。完全影响Adorner
。
用于绘制线条的Pen
定义为:
_pen = new Pen(Brushes.Black, 1);
并使用:
drawingContext.DrawLine(_pen, left, right);
AdornerLayer
是Window
上的默认值。如果根本不重要,则将Adorner
应用于TreeView
中放置的UserControl
上的Window
。
我该怎么做才能使它呈现我想要的方式?
答案 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个像素的宽/高线和其他类型的元素,他们做得并不正确。