有人可以解释为什么 WPF 中的一切都是模糊的吗?这是可以修复的吗?
3 回答
原因是抗锯齿系统会在线条与物理设备像素不对齐时将线条分散到多个像素上。
WPF 与解决方案无关。这意味着您以英寸而不是像素为单位指定用户界面元素的大小。WPF 中的逻辑单位是 1/96 英寸。之所以选择此比例,是因为大多数屏幕的分辨率为 96dpi。所以在大多数情况下,1 个逻辑单元匹配 1 个物理像素。但是如果屏幕分辨率发生变化,这个规则就不再有效。
所有 WPF 控件都提供一个属性SnapsToDevicePixels
。如果设置为 true,则控件确保所有边缘都精确地绘制在物理设备像素上。但不幸的是,此功能仅在控制级别可用。
快速解决:
在从根目录到模糊控件的每个容器上使用这些选项
UseLayoutRounding="True"
RenderOptions.BitmapScalingMode="NearestNeighbor"
SnapsToDevicePixels="True"
RenderOptions.ClearTypeHint="Enabled"
解释:
UseLayoutRounding=true修复子像素布局问题。它们经常发生,因为例如效果将控件的大小调整为像素之间的东西。
RenderOptions.BitmapScalingMode=NearestNeighbor修复了位图的模糊采样。使用效果或其他技术时使用位图。当它们被重新应用到容器或控件时,它们可能最终位于像素之间,因此会插入位图的像素。
SnapsToDevicePixels="True"修复了在像素之间渲染的垂直和水平多边形、线条和矩形
RenderOptions.ClearTypeHint="Enabled"在文本上重新启用 cleartype。它很容易被效果或渲染器不知道文本的确切背景禁用。
您应该在每个容器上使用它,因为有时,例如通过数据模板,这些选项再次默认用于子控件。
我花了几个小时试图找出自定义面板模糊的原因。在这些自定义面板上,我们使用了阴影边框效果。阴影是罪魁祸首。如果面板并排放置,它实际上会导致文本模糊。我没有足够高的声誉来发表评论,所以我正在回答这个问题。
UseLayoutRounding="True"
是 ecreif 回答的我的问题的解决方法。虽然我不需要他回答中的其他代码行,但我还是添加了它们。