155

问题在以下链接中进行了描述和演示:

说明:WPF 中的文本清晰度。这个链接有字体比较。

我想为这个问题收集所有可能的解决方案。Microsoft Expression Blend 使用 WPF,但字体看起来可读。

  • Microsoft Expression Blend 中的深色背景
  • 增加字体大小并更改字体(Calibri ...)[链接]
  • 嵌入窗体[链接]
  • 使用 GDI+ 和/或 Windows 窗体 TextRenderer 类将文本呈现到位图,然后将该位图呈现为 WPF 控件。[关联]

还有更多的解决方案吗?

这将在 VS2010(和 WPF4)beta 2 中修复

看起来终于解决了!

Scott Hanselman 的 ComputerZen.com:WPF 和文本模糊,现在完全清晰

4

11 回答 11

133

.NET 4 终于有了解决 WPF 文本渲染质量差的办法,但是隐藏的很好。为每个窗口设置以下内容:

TextOptions.TextFormattingMode="Display"

默认值为“理想”,这根本不是名称所暗示的。

TextOptions 中还有另外两个选项,即 TextHintingMode 和 TextRenderingMode,但它们都有合理的默认值。

于 2011-03-02T11:05:59.250 回答
109

技术背景

windowsclient.net 上的 WPF 文本程序管理器之一有一篇关于 WPF 文本呈现的深入文章:WPF 中的文本清晰度

问题归结为 WPF 需要一个线性缩放的字体渲染器来实现流畅的动画。另一方面,Pure ClearType 需要相当大的自由度来将垂直词干推入下一个像素。

如果比较经典的“级联”模式,差异就很明显了。左下角的WinForms,右上角的WPF:

虽然我也不喜欢 WPF 的字体渲染特性,但我可以想象如果动画会像在 Winforms 级联中那样跳跃会引起喧嚣。

玩注册表

我特别感兴趣的是 MSDN 文章“ ClearType Registry Settings ”的链接,它解释了注册表中可能的用户端调整:

  • ClearType 级别:子像素提示的数量
  • 伽玛级别
  • 像素结构:显示像素中的色条是如何排列的
  • 文本对比度级别:调整字形词干的宽度以使字体更重

使用这些设置并没有真正改善潜在问题,但可以通过减少敏感用户的颜色渗色效果来提供帮助。

另一种方法

Text Clarity 文章给出的最佳建议是增加字体大小和更改字体。Calibri 比标准的 Segoe UI 更适合我。由于它作为网络字体很受欢迎,我也尝试了 Verdana,但它的重量在 14pt 和 15pt 之间有一个令人讨厌的跳跃,这在为字体大小设置动画时非常明显。

WPF 4.0

WPF 4 将改进对影响字体呈现的支持。WPF 文本博客上有一篇文章解释了这些更改。最突出的是,现在(至少)有三种不同类型的文本渲染:

文字渲染对比

<grumble>这对每个设计师来说应该足够了。</grumble>

于 2008-10-10T08:31:38.650 回答
44

前几天我在使用应用了DropShadowEffect的边框时遇到了一个问题。结果是该边界内的所有文本都非常模糊。文本是在其他面板内还是直接在边框下方都没有关系 - 任何应用了效果的父级子级文本块似乎都会受到影响。

这种特殊情况的解决方案是不要将东西放在有效果的边框内,而是使用网格(或任何其他支持将内容放在彼此顶部的东西)并将一个矩形放置在与文本相同的单元格中(即作为视觉树中的兄弟)并将效果放在上面。

像这样:

<!-- 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>
于 2009-10-27T15:31:42.873 回答
10

这将在 VS2010(和 WPF4)beta 2 中修复:

于 2009-09-29T18:17:14.910 回答
7

我不认为它是一个错误,但默认配置确实很烦人。这是所有组合的比较

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

于 2014-04-20T15:12:17.453 回答
6

SnapToDevicePixels 仅适用于 WPF 形状(线条等),不适用于文本渲染器。

此问题没有已知的解决方法。根据微软的说法,这种行为是“设计使然”。

另请参阅Microsoft 论坛上讨论这些问题的线程 - 它已从 MS 人员那里得到了一些答复,阐明了他们在该问题上的立场。

于 2008-11-10T11:31:22.650 回答
6

从开发人员的角度来看,迄今为止唯一已知的“解决方法”是使用 GDI+ 和/或 Windows 窗体 TextRenderer 类将文本呈现为位图,然后将该位图呈现为 WPF 控件。除了明显的性能影响之外,这并不能缓解现有应用程序的问题。

我现在已经为这个问题创建了一个 Microsoft Connect 票证(令我惊讶的是,尽管存在所有负面因素,但在指定的跟踪器中没有实际的错误报告)。

由于这是向 Microsoft 传达请求和问题的官方渠道之一,我建议您也通过它来获得更快的答案。至少,如果您希望以一种或另一种方式解决该问题,则在那里投票支持该票和/或验证该问题将有助于引起 Microsoft PM 和工程师对该问题的注意,并可能提高其感知的优先级。

于 2008-11-12T07:04:41.597 回答
4

刚刚试用了 VS2010 测试版,这一切都是在 WPF 中完成的,它严重受到字体模糊问题的影响。特别是在工具提示上。

这似乎提供了一些证据表明 WPF4 实际上不会解决问题(如果看起来更糟的话)

于 2009-05-19T21:26:22.643 回答
4

哇,我不敢相信我终于让我的 WPF 字体可读了。而且我也不敢相信没有选项对话框可以使这些更改变得容易,而默认值在我的显示器上很糟糕。

这些注册表设置(十进制)对我有用,并且最接近我的常规 cleartype 字体:

  • ClearTypeLevel:10(主要是灰度混叠)
  • GammaLevel:1300(更高的 gamma 使字体太细,我看到了锯齿中的颜色)
于 2009-06-10T16:55:16.870 回答
3

他们说“SnapToDevicePixels = true”有效,但我从未见过任何好的结果。

我通过切换到不同的字体来对抗模糊的文本。

显然这不是问题的解决方案,但是这就是我解决它的方法。

于 2008-10-10T07:04:28.607 回答
0

如果您更喜欢使用 C# 基类为您的应用程序自定义窗口(或者现在有理由这样做),您可以通过以下方式设置文本格式以使用吸引人的显示模式:

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
于 2019-03-26T12:09:46.800 回答