为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕勒3428872 2022-01-09 09:54:24
我Adorner在 WPF 应用程序中使用一个在拖放操作中呈现放置点。这条线应该是一条黑线,一个像素粗,但它最终会变成两倍并略带灰色。我猜这在某种程度上与 WPF 在子像素级别的渲染方式有关。使用 的Window托管内容AdornerLayer已SnapsToDevicePixels设置为true,这在过去解决了类似的问题,但似乎根本没有影响Adorner。这是我得到的输出。文本下方 2 像素粗的灰线应为 1 像素粗和黑色:的Pen用于绘制线定义与:_pen = new Pen(Brushes.Black, 1);并使用以下方法绘制:drawingContext.DrawLine(_pen, left, right);该AdornerLayer存在于默认的Window。如果这很重要,则将Adorner应用于 a TreeViewon aUserControl放置在Window.我需要做些什么才能让它以我想要的方式呈现?
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

在您的装饰器类中,您可以尝试其中一些选项和它们的组合......这就是我在装饰器中使用的来消除模糊线条和模糊图标:


        RenderOptions.SetEdgeMode(this, EdgeMode.Aliased);

        RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor);


        SnapsToDevicePixels = true;

        UseLayoutRounding = true;

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


查看完整回答
反对 回复 2022-01-09
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

玩弄各种选项后,我发现,抵消left并right通过.5调用之前DrawLine修复这个问题。这似乎也印证了我的亚像素理论。


left.Offset(5, 5);

right.Offset(5, 5);

drawingContext.DrawLine(_pen, left, right);

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


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


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信