在WPF窗口和ElementHost内部文本呈现方式不同
我使用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变种。当普通文本可以接受时,粗体文本很难看。
有什么想法如何解决它?
预先感谢您!
(编辑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文本呈现的Ideal
和Display
模式之间的差异。意识到它主要是关于字体的,我不再认为是这种情况,但是我将在此讨论这个其他问题,因为对于任何想让他们的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
以获得低保真但更清晰的旧式渲染。
由于您可以根据每个元素进行选择,因此您可以根据自己的粗体和普通文本自主选择喜欢的外观。
对不起,我没有写它,我已经尝试过TextFormattingMode和SnapsToDevicePixels - 没有托管UserControl的结果。 – 2011-01-13 15:45:34