web-dev-qa-db-ja.com

WPF Blurryフォントの問題-ソリューション

問題は次のリンクで説明および実証されています。

説明: WPFのテキスト明瞭度 。このリンクにはフォント比較があります。

この問題のすべての可能な解決策を収集したいと思います。 Microsoft Expression BlendはWPFを使用しますが、フォントは読みやすく見えます。

  • Microsoft Expression Blendのような暗い背景
  • フォントサイズを増やしてフォントを変更する(Calibri ...) [link]
  • Windowsフォームの埋め込み [link]
  • GDI +またはWindows Forms TextRendererクラスを使用してテキストをビットマップにレンダリングし、そのビットマップをWPFコントロールとしてレンダリングします。 [リンク]

他に解決策はありますか?

これはVS2010(およびWPF4)ベータ2 で修正される予定です

最終的に解決されたように見える!

Scott HanselmanのComputerZen.com:WPFとテキストのぼやけ、完全なClarity

150
Robert Vuković

技術的背景

Windowsclient.netのWPFテキストプログラムマネージャーのいずれかからのWPFテキストレンダリングに関する詳細な記事があります: WPFのテキストクラリティ

問題は、WPFに要約すると、スムーズなアニメーションのために線形スケーリングのフォントレンダラーが必要です。一方、Pure ClearTypeでは、フォントを使用して垂直方向のステムを次のピクセルにプッシュするため、かなりの自由度があります。

古典的な「カスケード」パターンを比較すると、違いは明らかです。左下のWinForms、右上のWPF:

私もWPFのフォントレンダリングの特異性のファンではありませんが、Winformsカスケードのようにアニメーションがジャンプするのであれば、その騒を想像できます。

レジストリで遊ぶ

私にとって特に興味深いのは、MSDN記事「 ClearType Registry Settings 」へのリンクでした。このリンクでは、レジストリでユーザー側で可能な調整について説明しています。

  • ClearTypeレベル:サブピクセルヒンティングの量
  • ガンマレベル
  • ピクセル構造:ディスプレイピクセルのカラーストライプの配置方法
  • テキストのコントラストレベル:グリフステムの幅を調整してフォントを太くします

これらの設定をいじっても、根本的な問題は実際には改善されませんでしたが、敏感なユーザーの色にじみの影響を減らすことで役立ちます。

別のアプローチ

Text Clarityの記事が与えた最良のアドバイスは、フォントサイズを大きくし、フォントを変更することでした。 Calibriは標準のSegoe UIよりもうまく機能します。 Webフォントとしての人気のため、私もVerdanaを試しましたが、14ptから15ptの間で重量が急激に変化し、フォントサイズをアニメーション化すると非常に見やすくなりました。

WPF 4.0

WPF 4では、フォントのレンダリングに影響するサポートが改善されます。 WPFテキストブログの記事 に変更点の説明があります。最も顕著なのは、現在(少なくとも)3つの異なる種類のテキストレンダリングです。

text rendering comparison

<grumble>それはすべてのデザイナーにとって十分なロープであるべきです。</ grumble>

103
David Schmitt

.NET 4には、WPFの劣悪なテキストレンダリング品質に対する解決策がついにありますが、十分に隠されています。すべてのウィンドウに次を設定します。

TextOptions.TextFormattingMode="Display"

デフォルト値は「理想」であり、名前が示すとおりのものではありません。

TextOptionsには、TextHintingModeとTextRenderingModeの2つのオプションがありますが、どちらも適切なデフォルトがあります。

123
Helge Klein

先日、 DropShadowEffect が適用されたボーダーを使用したときに問題が発生しました。その結果、その境界内のすべてのテキストが非常にぼやけてしまいました。テキストが他のパネル内にあるか、境界線のすぐ下にあるかは関係ありません- Effect が適用されている親の子であるテキストブロックは影響を受けるようです。

この特定のケースの解決策は、効果のあるものを境界線内に配置せず、代わりにグリッド(またはコンテンツを互いの上に配置できるもの)を使用し、テキストと同じセルに長方形を配置することです(つまり、ビジュアルツリーの兄弟として)、その上にエフェクトを配置します。

そのようです:

<!-- 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>
37
Isak Savo

これは、VS2010(およびWPF4)ベータ2で修正される予定です。

10
Pavel Minaev

開発者の観点から、これまでに知られている唯一の「回避策」は、GDI +やWindows Forms TextRendererクラスを使用してテキストをビットマップにレンダリングし、そのビットマップをWPFコントロールとしてレンダリングすることです。明らかなパフォーマンスへの影響は別として、これは既存のアプリケーションの問題を軽減しません。

この問題のMicrosoft Connectチケット を作成しました(すべてのネガティブ性にもかかわらず、指定されたトラッカーに実際のバグレポートはありませんでした)。

それは、Microsoftにリクエストや質問を伝える公式のチャネルの1つであるため、より迅速な回答を得るためにそれを通過することもお勧めします。少なくとも、何らかの方法で問題に対処したい場合は、そこでチケットに投票したり、問題を検証したりすることで、Microsoft PMやエンジニアの注意をこの問題に向け、おそらくはその優先度を高めることができます。

6
Pavel Minaev

SnapToDevicePixelsは、テキストレンダラーではなく、WPF図形(線など)にのみ適用されます。

この問題に対する既知の回避策はありません。 Microsoftによると、この動作は「設計どおり」です。

また、問題を議論するMicrosoftフォーラムの this スレッドも参照してください。問題に関する彼らの立場を明確にするMSの人からのいくつかの返信があります。

6
Pavel Minaev

VS2010ベータ版を試してみましたが、これはすべてWPFで行われますが、ぼやけたフォントの問題のためにひどく苦しんでいます。特にツールチップについて。

それは、WPF4が実際に問題を解決しないという証拠を提供しているようです(何か悪い場合は)

4
Orion Edwards

私はそれをバグとは見ていませんが、デフォルトの設定は確かに非常に迷惑です。以下は、すべての組み合わせの比較です

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を使用している場合、問題はTransitioningContentControlhttps://github.com/MahApps/MahApps.Metro/issues/889 です

4
Gabriel

うわー、私はついに私のWPFフォントが読めるようになったとは信じられません。また、これらの変更を簡単に行うためのオプションダイアログがないため、ディスプレイのデフォルト値が恐ろしいとは思えません。

これらの レジストリ設定 (10進数)は私のために機能し、通常のcleartypeフォントに最も近くなります。

  • ClearTypeLevel:10(主にグレースケールのエイリアシング)
  • GammaLevel:1300(ガンマが高いとフォントが細くなりすぎ、エイリアシングで色が見えました)
4
VVS

彼らは「SnapToDevicePixels = true」は機能すると言っていますが、良い結果を見たことはありません。

別のフォントに切り替えることで、ぼやけたテキストに対処します。

明らかにこれは問題の解決策ではありませんが、これは私がそれを回避した方法です。

3
Inisheer

C#基本クラスを使用してアプリのウィンドウをカスタマイズする場合(または理由がある場合)、魅力的な表示モードを使用するようにテキストの書式を設定する方法は次のとおりです。

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
0
Edward Brey