2011-01-13 70 views
11

我使用WPF互操作性來在WinForms窗體內託管WPF用戶控件。 一切工作正常,除了醜陋的文本呈現:在WPF窗口和ElementHost內部文本呈現方式不同

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

- 這裏是WPF窗口簡單標籤:
WPF Window http://img525.imageshack.us/img525/7049/wpfwindow.png

- 當WPF用戶控件中的WinForms託管所示的相同的標籤:
WPF Interop http://i51.tinypic.com/14j4xnc.jpg

互操作的變體是完全不同的:字符間的間隔是零和文字看起來更大膽的純WPF變種。當普通文本可以接受時,粗體文本很難看。

有什麼想法如何解決它?

預先感謝您!

回答

17

(編輯1月18至補充說,它不只是字體渲染模式,而且字體本身。)

這裏有兩個相關因素:字體和字體格式模式。

Windows窗體宿主應用程序很有氣勢的「Microsoft無襯線」默認字體家族在8.25pt的字體大小,這在WPF的計量單位是11。FontSize但WPF通常會使用不同的字體 - 我運行默認的Aero主題的Windows 7,而WPF默認爲Segoe UI,FontSize爲12.

因此,您在這裏看到不同結果的最大原因是它們是兩種不同的字體。將FontFamily="Segoe UI" FontSize="12"添加到UserControl根元素使得兩個WPF示例看起來更加一致。 (不過,這當然使你的WPF文字看起來與在包含Windows窗體應用程序。這就是全部的原因ElementHost傳播的Windows窗體字體選擇到WPF內容。文字不太一致)

我編輯在此之前,我曾認爲這可能是由於WPF文本呈現的IdealDisplay模式之間的差異。意識到它主要是關於字體的,我不再認爲是這種情況,但是我將在此討論這個其他問題,因爲對於任何想讓他們的WPF文本與他們的Windows保持一致的人都是有用的形成文本。 WPF的默認值爲Ideal,但如果您在Windows窗體應用程序中運行,則可以認爲Display更好,因爲這會使其與Windows窗體通常呈現的內容看起來一致。

您可以在WPF中每個元素的基礎上,加入此控制這一點:

TextOptions.TextFormattingMode="Display" 

(或"Display"取決於哪種模式你想要的)。 WPF v4中增加了這種可附加屬性,讓您可以在WPF自第一次發佈以來的可縮放但略微模糊的文本呈現中進行選擇,以及Win32和GDI +(並因此Windows表格)使用。這會影響你應用它的元素,以及任何後代。 (例如,如果您將其設置爲StackPanel,則應將其應用於該面板中的所有元素,除非您還將其設置爲兒童本地的其他值。)

默認情況下,WPF會嘗試保持比原始字體設計更好的保真度,而不是Win32或GDI +。而且它也以某種方式呈現文本,這意味着它可以一致地縮放 - 將字體大小增加12%將使文本的寬度在屏幕上增大12%。在Win32或GDI +中,情況並非如此,您可以獲得更復雜的非線性更改。

但是很多人抱怨說,爲了獲得更好的保真度,你會得到模糊感增加。所以這就是爲什麼WPF 4引入了新的屬性。將其設置爲Display以獲得低保真但更清晰的舊式渲染。

由於您可以根據每個元素進行選擇,因此您可以根據自己的粗體和普通文本自主選擇喜歡的外觀。

+0

對不起,我沒有寫它,我已經嘗試過TextFormattingMode和SnapsToDevicePixels - 沒有託管UserControl的結果。 – 2011-01-13 15:45:34

相關問題