gpt4 book ai didi

wpf - 文本在 WPF 窗口和 ElementHost 内部呈现不同

转载 作者:行者123 更新时间:2023-12-04 00:43:02 25 4
gpt4 key购买 nike

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

    <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

互操作变体完全不同:字符间隔为零,文本看起来比纯 WPF 变体更粗。当普通文本可以接受时,粗体文本是丑陋的。
有什么想法可以解决它吗?
先感谢您!

最佳答案

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

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

您的 Windows 窗体主机应用程序正在以 8.25pt 的字体大小强加“Microsoft Sans Serif”的默认字体系列,在 WPF 的度量单位中,它是 FontSize 11. 但 WPF 通常会使用不同的字体 - 我正在使用默认 Aero 主题运行 Windows 7,WPF 默认使用带有 FontSize 的 Segoe UI。共 12 个。

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

在我编辑这个之前,我认为这可能归结于Ideal之间的差异。和 Display WPF 文本渲染模式。意识到这主要是关于字体后,我不再认为是这种情况,但我将把对另一个问题的讨论留在这里,因为它对于任何试图让他们的 WPF 文本看起来与他们的 Windows 保持一致的人来说仍然有用形成文本。 WPF 的默认值是 Ideal ,但如果您在 Windows 窗体应用程序中运行,可以说是 Display更好,因为这会使它看起来与 Windows 窗体通常呈现的东西一致。

您可以通过添加以下内容在 WPF 中基于每个元素来控制它:

TextOptions.TextFormattingMode="Display"

(或 "Display" 取决于您想要的模式)。这个可附加属性是在 WPF v4 中添加的,让您可以在 WPF 自首次发布以来具有的可扩展但略微模糊的文本渲染和 Win32 和 GDI+(因此 Windows表格)使用。这将影响您应用它的元素,以及任何后代。 (例如,如果您在 StackPanel 上设置它,它应该应用于该面板中的所有元素,除非您还在子项上将其设置为本地不同的值。)

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

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

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

关于wpf - 文本在 WPF 窗口和 ElementHost 内部呈现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4679172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com