WPF模糊字体问题 – 解决scheme
问题在以下链接中进行了描述和演示:
- Paul Stovell WPF:模糊文本渲染
- www.gamedev.net论坛
- Microsoft Connect:WPF文本渲染器在小字号上生成严重模糊的文本
说明: WPF中的文本清晰度 。 这个链接有字体比较。
我想收集这个问题的所有可能的解决scheme。 Microsoft Expression Blend使用WPF,但字体看起来是可读的。
- 在Microsoft Expression Blend中使用深色背景
- 增加字体大小和改变字体(Calibri …) [link]
- embeddedWindows窗体[链接]
- 使用GDI +和/或Windows窗体TextRenderer类将文本呈现为位图,然后将该位图呈现为WPF控件。 [链接]
有没有更多的解决scheme?
这将在VS2010(和WPF4)beta2中得到解决
WPF 4.0文本堆栈的改进
它看起来已经最终解决了!
Scott Hanselman的ComputerZen.com:WPF和Text Blurriness,现在完全清晰
WPF文本博客:其他WPF文本清晰度改进
技术背景
有一篇关于windowsclient.net上WPF文本程序pipe理器的WPF文本呈现的深度文章:WPF中的文本透明度 。
问题归结为WPF需要一个线性缩放字体渲染器的平滑animation。 另一方面,纯ClearType需要相当大的自由度,字体才能将垂直茎推入下一个像素。
如果比较经典的“级联”模式,差异是显而易见的。 WinForm在左下angular,WPF在右上angular:
虽然我不是WPF的字体渲染特质的粉丝,但我可以想象,如果animation会像Winforms级联一样跳跃的话,我会大声疾呼。
玩registry
我特别感兴趣的是链接到MSDN文章“ ClearTyperegistry设置 ”,它解释了registry中可能的用户端调整:
- ClearType级别:子像素提示量
- 伽玛水平
- 像素结构:如何排列显示像素中的彩色条纹
- 文字对比度:调整字形的宽度,使字体更重
玩这些设置并没有真正改善潜在的问题,但可以帮助减less敏感用户的色彩stream失效果。
另一种方法
Text Clarity文章给出的最好的build议是增加字体大小和改变字体。 Calibri比标准的Segoe UI更适合我。 由于networking字体的stream行,我也尝试了Verdana,但是它在14pt和15pt之间有一个令人讨厌的跳跃,这在animation字体大小时非常明显。
WPF 4.0
WPF 4将会改进对影响字体渲染的支持。 WPF文本博客上有一篇文章解释了这些变化。 最突出的是,现在(至less)有三种不同types的文本渲染:
<grumble>对每一个devise师来说,这都应该是足够的绳索。</ grumble>
.NET 4最终解决了WPF糟糕的文本渲染质量,但它隐藏得很好。 为每个窗口设置以下内容:
TextOptions.TextFormattingMode="Display"
默认值是“理想”,这完全不是名字所暗示的。
TextOptions中还有两个选项,即TextHintingMode和TextRenderingMode,但它们都有合理的默认值。
有一天我遇到了一个问题,那就是我使用了一个应用DropShadowEffect的边框。 结果是在边界内的所有文本都非常模糊。 无论文本是在其他面板内还是在边界的正下方 – 任何具有应用效果的父级子级的文本块似乎都会受到影响。
对于这种特殊情况的解决scheme是不把东西放在具有效果的边界内,而是使用网格(或其他支持将内容放在另一个之上的东西),并将矩形放在与文本相同的单元中(即作为视觉树中的兄弟姐妹),并将其影响。
像这样:
<!-- don't do this ---> <Border> <Border.Effect> <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/> </Border.Effect> <TextBlock Text="This Text Will Be Blurry" /> </Border> <!-- Do this instead --> <Grid> <Rectangle> <Rectangle.Effect> <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/> </Rectangle.Effect> </Rectangle> <TextBlock Text="This Text Will Be Crisp and Clear" /> </Grid>
这将在VS2010(和WPF4)testing版2中得到解决:
SnapToDevicePixels只适用于WPF形状(线条等),而不适用于文本渲染器。
这个问题没有已知的解决方法。 据微软称,这种行为是“按devise”。
在微软论坛上也可以看到这个讨论这个问题的线索 – 它已经收到了一些MS小组的回复,澄清了他们在这个问题上的立场。
从开发人员的angular度来看,迄今为止唯一已知的“解决方法”是使用GDI +和/或Windows Forms TextRenderer类将文本呈现为位图,然后将该位图呈现为WPF控件。 除了明显的性能影响之外,这并不能缓解现有应用程序的问题。
我现在已经为这个问题创build了一个Microsoft Connect票据 (令我吃惊的是,尽pipe所有的消极性,指定的跟踪器没有实际的错误报告)。
既然这是向微软传达请求和问题的官方渠道之一,我也build议通过它来更快地回答。 至less,如果您希望以这种或那种方式解决问题,那么在那里投票并/或确认问题将有助于引起微软首席技术官和工程师注意这个问题,并可能提高其认为的优先级。
刚刚尝试过VS2010testing版,这一切都是在WPF中完成的,而且从模糊字体问题中受到很大的影响。 特别是在工具提示。
这似乎给了一些证据,WPF4实际上不会解决问题(如果有的话看起来更糟)
哇,我不能相信我终于得到我的WPF字体可读。 而且我也不能相信没有任何选项对话框来让这些更改变得简单,而默认值在我的显示器上是可怕的。
这些registry设置 (十进制)为我工作,并最接近我的常规cleartype字体:
- ClearTypeLevel:10(主要是灰度混叠)
- GammaLevel:1300(更高的伽马使字体太薄,我看到了混叠的颜色)
他们说“SnapToDevicePixels = true”的作品,但我从来没有看到任何好的结果。
我通过切换到不同的字体来对付模糊的文本。
显然这不是解决问题的办法,但是我已经解决了这个问题。
我不认为它是一个错误,但默认configuration确实是非常烦人的。 这是所有组合的比较
TextOptions.TextRenderingMode TextOptions.TextFormattingMode RenderOptions.ClearTypeHint
SnapToDevicePixels
在文本渲染中不做任何区别。
我更喜欢:
TextOptions.TextRenderingMode="Auto" TextOptions.TextFormattingMode="Ideal" RenderOptions.ClearTypeHint="Auto"
垂直线永远不会模糊。
使用的字体是Open Sans Light,如果使用得当,就像在最新的TeamViewer中一样,这个字体可以非常美观。
对于那些使用Mahapps.Metro,问题是TransitioningContentControl
https://github.com/MahApps/MahApps.Metro/issues/889