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在文本渲染中不做任何区别。

http://i.stack.imgur.com/cS3S2.png

我更喜欢:

 TextOptions.TextRenderingMode="Auto" TextOptions.TextFormattingMode="Ideal" RenderOptions.ClearTypeHint="Auto" 

垂直线永远不会模糊。

使用的字体是Open Sans Light,如果使用得当,就像在最新的TeamViewer中一样,这个字体可以非常美观。

对于那些使用Mahapps.Metro,问题是TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889