2011-01-13 86 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