13

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

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

-- 这是 WPF 窗口上的简单标签:
WPF 窗口 http://img525.imageshack.us/img525/7049/wpfwindow.png

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

互操作变体完全不同:字符间间隔为零,文本看起来比纯 WPF 变体更粗。当普通文本可以接受时,粗体文本很难看。

有什么想法可以解决吗?

先感谢您!

4

1 回答 1

21

(编辑于 1 月 18 日,补充说它不仅是字体渲染模式,还有字体本身。)

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

您的 Windows 窗体主机应用程序以 8.25pt 的字体大小强制使用“Microsoft Sans Serif”的默认字体系列,在 WPF 的测量单位中是FontSize11。但 WPF 通常会使用不同的字体 - 我正在运行 Windows 7使用默认 Aero 主题,WPF 默认为 Segoe UI,aFontSize为 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表格)使用。这将影响您应用它的元素,以及任何后代。(例如,如果您在 a 上设置它,StackPanel它应该适用于该面板中的所有元素,除非您还在子节点上将其设置为本地不同的值。)

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

但是很多人抱怨为了换取更好的保真度而获得的模糊度增加。这就是 WPF 4 引入该新属性的原因。将其设置Display为获得较低保真度但更清晰的旧式渲染。

由于您可以在每个元素的基础上选择它,您可以为您的粗体和普通文本选择您喜欢的独立外观。

于 2011-01-13T13:59:17.523 回答