文本在WPF窗口和ElementHost内部呈现方式不同

文本在WPF窗口和ElementHost内部呈现方式不同,wpf,elementhost,Wpf,Elementhost,我使用WPF互操作性在WinForms表单中托管WPF用户控件。 除了难看的文本渲染外,一切正常: <Label Content="Normal text" Name="labelNormal"/> <Label Content="Bold text" Name="labelBold" FontWeight="Bold" /> --下面是WPF窗口上的

我使用WPF互操作性在WinForms表单中托管WPF用户控件。 除了难看的文本渲染外,一切正常:

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

--下面是WPF窗口上的简单标签:

--以及WPF用户控件托管在WinForms中时显示的相同标签:

互操作变量有很大不同:字符间隔为零,文本看起来比纯WPF变量更粗体。如果可以接受普通文本,则粗体文本不好看

有没有办法解决这个问题

提前谢谢你

(1月18日编辑,添加了不仅是字体呈现模式,还有字体本身。)

这里有两个相关因素:字体和字体格式模式

您的Windows窗体宿主应用程序强制使用默认字体系列“Microsoft Sans Serif”,字体大小为8.25pt,在WPF的度量单位中,字体大小为11。但是WPF通常会使用不同的字体——我使用默认的Aero主题运行Windows7,WPF默认为SegoeUI,字体大小为12

所以你在这里看到不同结果的最大原因是这是两种不同的字体。将
fontfamine=“Segoe UI”FontSize=“12”
添加到
UserControl
根元素使两个WPF示例看起来更加一致。(但这当然会使您的WPF文本看起来与包含Windows窗体应用程序中的文本不太一致。这就是
ElementHost
将Windows窗体字体选择传播到WPF内容的全部原因。)

在编辑这篇文章之前,我认为这可能是由于WPF文本呈现的
理想模式
显示模式之间的差异。意识到这主要是关于字体的,我不再认为是这种情况,但我将把其他问题的讨论留在这里,因为它仍然对任何试图使WPF文本与Windows窗体文本保持一致的人有用。WPF的默认设置是
Ideal
,但是如果您在Windows窗体应用程序中运行,可以说
Display
更好,因为这将使它看起来与Windows窗体通常呈现的内容一致

通过添加以下内容,您可以在WPF中对每个元素进行控制:

TextOptions.TextFormattingMode="Display"
(或
“显示”
,具体取决于所需的模式)。此可附加属性是在WPF v4中添加的,以允许您在WPF自第一次发布以来具有的可伸缩但稍微模糊的文本呈现和Win32和GDI+(以及Windows窗体)使用的扭曲但尖锐的网格拟合呈现之间进行选择。这将影响应用它的元素以及所有子体。(例如,如果在
StackPanel
上设置此选项,则应将其应用于该面板中的所有元素,除非在子面板上也将其本地设置为不同的值。)

默认情况下,WPF试图保持比Win32或GDI+更好的原始字体设计的逼真度。而且它还以一种方式呈现文本,这意味着它的缩放一致-增加字体大小,比如说12%,将使文本在屏幕上的宽度增大12%。在Win32或GDI+中,情况并非如此,在那里,您会得到相当复杂的非线性更改

但许多人抱怨说,为了获得更好的逼真度,你会得到更多的模糊度。这就是WPF4引入新属性的原因。将其设置为
Display
,以获得保真度较低但更清晰的旧式渲染


由于您可以根据每个元素选择它,因此您可以为粗体文本和普通文本分别选择您喜欢的外观。

抱歉,我没有编写它,我尝试了TextFormattingMode和SnapsToDevicePixels--对于托管的UserControl没有结果。SnapsToDevicePixels没有帮助。您在哪里设置文本格式化模式?在用户控件上,还是在标签上?(你没写什么?)我试了两种方法,在用户控件和标签上,结果都是一样的。没什么变化。这是测试应用程序——啊——谢谢。这说明这比我想象的要简单得多:Windows窗体使用了不同的默认字体。您的文本看起来不同,因为它的字体不同。