WPFぼやけたフォントの問題-ソリューション


153

問題は次のリンクで説明され、示されています。

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

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

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

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

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

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

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


VS2010RCはまったく使用できませんmpdreamz.nl/vs2010RC-blur.png
Martijn Laarman

私のマシンのVS2010RCはあなたの写真よりもはるかに良く見えます。実際、白い背景の場合は非常に優れていますが、暗い背景の場合はまだうまくいきません。
RobertVuković2010年

この問題の解決策は見つかりましたか?実際、私はアプリケーションに同じ問題があり、VSPFでWPF 3.5を使用しています
SharpUrBrain

最後の3つのリンクは死んでいます。
SHIN JaeGuk

回答:


107

技術的背景

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

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

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

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

レジストリで遊ぶ

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

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

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

別のアプローチ

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

WPF 4.0

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

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

<grumble>すべてのデザイナーにとって、これで十分です。</ grumble>


11
優れた説明、+ 1。おそらく、なぜFlashがこのような恐ろしいフォントレンダリングも行うのかを説明しています。
Jeff Atwood、

1
はい。これは良い説明ですが、アニメーションを行わないことがわかっているときに、フォントのヒントを表示して見栄えを良くする方法があったらと思います。これは、ヒントを最適化している特定のスケールを意味すると思います。このようなことにより、WPFはまだベータ版のように見えます。
PeterAllenWebb 2008

「スケーラブル」バリアントがフォントヒントを使用しないのではなく、WPFがClearTypeのようにピクセルグリッドをヒットするために最適化しないだけです。間違いなくSnapToDevicePixelsはテキストに対して機能するはずですが、コントロールがスナップできるかどうかを判断できないため、これを常に継承する必要があります。
デビッドシュミット

2
特に関連するのは、TextOptions.TextFormattingMode添付プロパティ(msdn.microsoft.com/en-us/library/ee169597.aspx)です。WPF4およびSilverlightには、UseLayoutRounding(msdn.microsoft.com/en-us/library/dd783605.aspx)およびSnapsToDevicePixels(msdn.microsoft.com/en-us/library/…)プロパティもあります。
パット

@All:WPF3.5でテキストのアンチエイリアスを無効にする方法が見つからないため、ラベルまたはボタンのテキストが非常に良く見えません。理想的には、フォントのアンチエイリアスをグローバルに無効にしたいと思います。どうすればこれを達成できますか?
SharpUrBrain 2011

128

.NET 4は最終的にWPFの貧弱なテキストレンダリング品質を解決しますが、十分に隠されています。すべてのウィンドウに次を設定します。

TextOptions.TextFormattingMode="Display"

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

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


すべて。ありがとう。それは私が問題を解決するのに役立ちますが、あなたは一度だけ、<グリッド>のようなコンテナ内のことを定義する必要があります
ピーター・デュ

はい。ウィンドウに設定した場合、そのウィンドウ内に含まれるすべてに対して有効です。
Helge Klein

VS2010 RTM / .Net 4でテキストの書式設定がどれほど優れているかについて、さまざまなサイトやブログでこれを探して多くの時間を費やしました(同意します、そうです!)。しかし、それらを使用して構築するWPFアプリケーションをどのように作成できるかについて言及する人はいませんでした。なぜそのプロパティはそれほど隠されているのですか?どうもありがとうございました。
M-Peror 2012年

5
私が欲しいのはこれだけ!WPFレンダリングがどれほど洗練されているかは気にしません。フォントはだれにも受け入れられません。
Jerry Liang

1
「ディスプレイ」ではなく、「理想的」が機能します。プロジェクトは.NET 4.6.2にあります。多分彼らは混乱した名前を修正しました。
joe

40

先日、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>

これはうまくトリックを行いました。ちょっとしたハックですが、設定などをいじるよりはましです。ありがとう。しかし、私がしなければならないことの1つは、四角形の塗りつぶしを何かに設定することでした。たぶんこれは私のセットアップだったのかもしれません。
10

ええ、あなたは正しいです..長方形はデフォルトで透明で、ドロップシャドウが奇妙に見えます。
Isak Savo

これは私のサンプルアプリケーションでは発生していません
。WPF3.5

@SharpUrBrain:何が起こっていないのですか?2番目の例を使用してもまだぼやけていますか?
Isak Savo、2011

はい、2つ目の例を使用した後もぼやけています
SharpUrBrain


6

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

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

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


TextOptions.TextFormattingMode添付プロパティ(msdn.microsoft.com/en-us/library/ee169597.aspx)を使用してWPF 4で修正されました。
Pat

1
プロパティ名は、「SnapsToDevicePixels」であり、「SnapToDevicePixels」ではありません。
Nir Kornfeld、2018年

6

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

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

これはマイクロソフトに要求や質問を伝える公式チャネルの1つであるため、より迅速な回答を得るために、それについても検討することをお勧めします。少なくとも、何らかの方法で問題に対処したい場合は、そこでチケットに投票するか、問題を検証することで、Microsoft PMとエンジニアにこの問題への注意を喚起し、おそらくその優先順位を上げることができます。


6

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

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です。


4

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

これは、WPF4が実際には問題を解決しないことを示すいくつかの証拠を与えるようです(どちらかと言えば、それが悪化しているように見えます)。


3
テキストがぼやけているUIの各場所について、VS2010B1に対してバグを報告しています。ツールチップはほとんどコミカルに悪いと私は同意します。これがWPF4で修正されると明示的に言われていることを考えると、私はそれがこのベータ版のためのカットを作らなかったことを願うだけです。
ウィルディーン

4

うわー、ようやくWPFフォントが読めるようになりました。また、ディスプレイのデフォルト値がひどいのに、これらの変更を容易にするオプションダイアログがないことも信じられません。

これらのレジストリ設定(10進数)は私にとってはうまくいき、私の通常のcleartypeフォントに最も近くなります。

  • ClearTypeLevel:10(ほとんどがグレースケールのエイリアシング)
  • GammaLevel:1300(ガンマが高いとフォントが細くなりすぎ、エイリアスの色が表示されていました)

3

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

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

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


SnapToDevicePixels = "true"を使用したTextBlockと、それを使用しないTextBlockを比較したところ、12duis のSegoe UIフォントとの違いはありませんでした。どんなフォントを使っていますか?
デビッドシュミット

また、フォントを切り替えることで状況を改善しました。私たちが選んだフォントはAvenirでした(少なくともWindows XPにはデフォルトでインストールされていないと思います)。
cplotts 2008年

0

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

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.