WPF字体模糊问题-解决方案

WPF字体模糊问题-解决方案,wpf,fonts,Wpf,Fonts,以下链接描述并演示了问题: 说明:。此链接具有字体比较功能 我想收集这个问题所有可能的解决方案。Microsoft Expression Blend使用WPF,但字体看起来可读 Microsoft Expression Blend中的深色背景 增加字体大小并更改字体(Calibri…) 嵌入windows窗体 使用GDI+和/或Windows Forms TextRenderer类将文本渲染为位图,然后将该位图渲染为WPF控件 还有其他解决办法吗 看来问题终于解决了 他们说“Sn

以下链接描述并演示了问题:

说明:。此链接具有字体比较功能

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

  • Microsoft Expression Blend中的深色背景
  • 增加字体大小并更改字体(Calibri…)
  • 嵌入windows窗体
  • 使用GDI+和/或Windows Forms TextRenderer类将文本渲染为位图,然后将该位图渲染为WPF控件
还有其他解决办法吗

看来问题终于解决了

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

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

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

技术背景 windowsclient.net上的一个WPF文本程序管理器中有一篇关于WPF文本呈现的深入文章:

问题归结为WPF需要线性缩放字体渲染器来平滑动画。另一方面,纯ClearType在字体上有相当大的自由度,可以将垂直词干推到下一个像素中

如果与经典的“级联”模式相比较,差异是显而易见的。WinForms位于左下方,WPF位于右上方:

虽然我也不喜欢WPF的字体渲染特性,但我可以想象动画是否会像Winforms cascade中那样跳跃的喧嚣

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

  • ClearType级别:子像素暗示的数量
  • 伽马能级
  • 像素结构:显示像素中色条的排列方式
  • 文本对比度级别:调整字形词干的宽度,使字体更重
使用这些设置并没有真正改善根本问题,但可以减少敏感用户的颜色溢出效应

另一种方法 文本清晰度文章给出的最佳建议是增加字体大小和更改字体。Calibri比标准的Segoe UI更适合我。由于它作为网页字体的流行,我也尝试了Verdana,但它的重量在14磅到15磅之间急剧增加,这在设置字体大小动画时非常明显

WPF 4.0 WPF 4将改进对影响字体呈现的支持。有人在解释这些变化。最重要的是,现在(至少)有三种不同的文本呈现:


这对每个设计师来说应该足够了。

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

这个问题没有已知的解决方法。根据微软的说法,这种行为是“故意的”


也可以看到微软论坛上讨论这些问题的帖子——它已经收到了一些来自MS guys的回复,澄清了他们在这个问题上的立场。

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

我现在已经创建了一个(令我惊讶的是,尽管存在所有负面影响,但在指定的跟踪器中没有实际的bug报告)


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

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


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

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

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

  • ClearTypeLevel:10(主要是灰度混叠)
  • GammaLevel:1300(较高的gamma使字体太薄,我看到了别名中的颜色)

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


      前几天,当我使用带有应用程序的边框时,遇到了一个问题。结果是,该边界内的所有文本都非常模糊。不管文本是在其他面板内还是直接在边框下,任何作为父对象的子对象的文本块都会受到影响

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

      像这样:

      <!-- 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>
      

      .NET4终于找到了解决WPF糟糕的文本呈现质量的方法,但它隐藏得很好。为每个窗口设置以下内容:

      TextOptions.TextFormattingMode="Display"
      
      默认值为“理想”,与名称完全不同


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

      我不认为这是一个bug,但默认配置确实非常麻烦
      TextOptions.TextRenderingMode
      TextOptions.TextFormattingMode
      RenderOptions.ClearTypeHint
      
      TextOptions.TextRenderingMode="Auto"
      TextOptions.TextFormattingMode="Ideal"
      RenderOptions.ClearTypeHint="Auto"
      
      public class SnappyWindow : Window
      {
          public SnappyWindow()
          {
              SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
          }
      }