155

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

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

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

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

これ以上の解決策はありますか?

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

それは最終的に解決されたようです!

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

4

11 に答える 11

133

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

TextOptions.TextFormattingMode="Display"

デフォルト値は「理想的」で、名前が意味するものとはまったく異なります。

TextOptions には他に TextHintingMode と TextRenderingMode という 2 つのオプションがありますが、どちらも実用的なデフォルトを持っています。

于 2011-03-02T11:05:59.250 に答える
109

技術的背景

windowsclient.net の WPF テキスト プログラム マネージャーの 1 つからの WPF テキスト レンダリングに関する詳細な記事があります: Text Clarity in WPF

問題は、滑らかなアニメーションのために線形にスケーリングするフォントレンダラーを必要とする WPF に要約されます。一方、純粋な ClearType では、垂直方向のステムを次のピクセルに押し込むために、フォントにかなりの自由度が必要です。

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

私は WPF のフォント レンダリングの特異性も好きではありませんが、Winforms カスケードのようにアニメーションがジャンプした場合の騒ぎは想像できます。

レジストリで遊ぶ

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

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

これらの設定をいじっても、根本的な問題は実際には改善されませんでしたが、敏感なユーザーの色のにじみ効果を減らすことによって助けることができます.

別のアプローチ

Text Clarity の記事で得られた最良のアドバイスは、フォント サイズを大きくしてフォントを変更することでした。Calibri は、標準の Segoe UI よりもうまく機能します。Web フォントとして人気があるため、Verdana も試してみましたが、14pt と 15pt の間でウェイトが大きく跳ね上がり、フォント サイズをアニメーション化すると非常に目立ちます。

WPF4.0

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

テキスト レンダリングの比較

<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) ベータ 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

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

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

これは、Microsoftに要求や質問を伝達するための公式チャネルの1つであるため、より迅速な回答を得るためにも、このチャネルを通過することをお勧めします。少なくとも、問題を何らかの方法で解決したい場合は、そこでそのチケットに投票したり、問題を検証したりすることで、Microsoft PMやエンジニアの注意をこの問題に引き付け、認識される優先順位を上げることができます。

于 2008-11-12T07:04:41.597 に答える
6

SnapToDevicePixels は WPF シェイプ (線など) にのみ適用され、テキスト レンダラーには適用されません。

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

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

于 2008-11-10T11:31:22.650 に答える
4

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

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

  • ClearTypeLevel: 10 (ほとんどグレースケール エイリアシング)
  • GammaLevel: 1300 (ガンマを高くするとフォントが細くなりすぎて、エイリアシングで色が見えていました)
于 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 に答える