2011-01-13 7 views
11

私はWPFの相互運用性を使用して、WinFormsフォーム内でWPFユーザーコントロールをホストします。 WPFウィンドウ上の簡単なラベルここにある -WPFウィンドウと内部のElementHostでテキストが異なるレンダリング

<Label Content="Normal text" Name="labelNormal"/> 
    <Label Content="Bold text" Name="labelBold" FontWeight="Bold" /> 


WPF Window http://img525.imageshack.us/img525/7049/wpfwindow.png

- とWPFユーザーコントロールがリサイズでホストされているときに表示同じラベルを すべてが醜いテキストのレンダリングを除いてOK動作します:
WPF Interop http://i51.tinypic.com/14j4xnc.jpg interopのバリアントはかなり異なっています。中間文字間隔がゼロで、テキストが純粋なWPFバリアントよりも太く見えます。通常のテキストが受け入れられる場合、太字のテキストは醜いです。

修正方法はありますか?

ありがとうございます!

答えて

17

(。それだけでレンダリングモードフォント、だけでなく、フォントそのものではないことを追加するために月18日に編集)

関連する2つの要因がここにあります:フォント、フォントの書式設定モードが。

Windowsフォームのホストアプリケーションは、フォントサイズが8.25ptで、WPFの測定単位がFontSizeの11のデフォルトフォントファミリである "Microsoft Sans Serif"を使用していますが、WPFでは通常、既定のAeroテーマを使用してWindows 7を実行していて、WPFのデフォルト設定はです。

ここで異なる結果が表示される最大の理由は、2つの異なるフォントです。 FontFamily="Segoe UI" FontSize="12"UserControlルート要素に追加すると、2つのWPFの例がより一貫して見えるようになります。 (ただし、WPFのテキストは、含まれるWindowsフォームアプリケーションのテキストと一貫性がなくなります。ElementHostがWPFのコンテンツにWindowsフォームのフォントの選択を伝播させる理由のすべてです)。

これを編集する前にWPFテキストレンダリングのためのIdealDisplayモードの違いにまではならないと考えていました。これは主にフォントに関するものだと認識していますが、これは当てはまりませんが、WPFテキストをWindowsと一貫して見せようとしている人にとっては便利なので、ここではこの他の問題の議論を残しますフォームテキスト。 WPFのデフォルト値はIdealですが、Windowsフォームアプリケーションで実行している場合は、おそらくDisplayが良いでしょう。これは、Windowsフォームが通常どおりにレンダリングする方法と一貫して見えるためです。

あなたは、この追加することにより、要素ごとのベースでWPFでこれを制御することができます(あなたが望むどのモードに応じて、または"Display"

TextOptions.TextFormattingMode="Display" 

を。このアタッチ可能なプロパティは、WPF v4で追加されました。これにより、最初にリリースされて以来、スケーラブルな、わずかにぼやけたテキストレンダリングと、Win32およびGDI +(したがってWindowsフォーム)を使用します。それはそれを適用する要素に影響を与えます。また、すべての子孫にも影響します。 (たとえば、これをStackPanelに設定した場合は、そのパネルのすべての要素に適用する必要があります(子供にローカルで異なる値に設定しない限り)。)

既定では、WPFは、Win32またはGDI +よりも元の書体デザインの忠実度を維持しようとします。また、テキストを一定の縮尺でレンダリングすることもできます。たとえば、フォントサイズを12%増やすと、テキストの幅が画面上で12%大きくなります。これは、Win32やGDI +では複雑で非線形な変更が行われる場合には当てはまりません。

しかし、多くの人が、忠実度の向上と引き換えに、ぼかしの増加について苦情を言いました。だからこそ、WPF 4はその新しいプロパティを導入しました。 Displayに設定すると、忠実度は低いがシャープな古いスタイルのレンダリングが得られます。

要素単位で選択できるので、ボールド体と通常のテキストの見た目を自由に選ぶことができます。

+0

申し訳ありませんが、書きませんでした。TextFormattingModeとSnapsToDevicePixelsを試しました。ホストされているUserControlの結果はありません。 –

+0

SnapsToDevicePixelsは役に立ちません。どこでTextFormattingModeを設定していますか? UserControl、またはラベルに? (そして、あなたは何を書かなかったのですか?) –

+0

私はUserControlとLabelsで両方の方法を試しましたが、結果は同じでした。何も変わっていません。 –