4

我遇到了一个问题,使某些文本粗体的字体粗细使其小于普通字体加权文本。我发现这是因为我将 TextFormattingMode 设置为“Display”;如果 TextFormattingMode 设置为“理想”,则不会出现此问题。

例如,下面的代码:

 <Label FontFamily="Calibri" FontSize="12" FontWeight="Bold" Content="This is some test text" TextOptions.TextFormattingMode="Ideal"/>
 <Label FontFamily="Calibri" FontSize="12" Content="This is some test text" TextOptions.TextFormattingMode="Ideal"/>
 <Label></Label>
 <Label FontFamily="Calibri" FontSize="12" FontWeight="Bold" Content="This is some test text" TextOptions.TextFormattingMode="Display"/>
 <Label FontFamily="Calibri" FontSize="12" Content="This is some test text" TextOptions.TextFormattingMode="Display"/>

产生以下内容:

XAML 运行时的结果

如果我将最后两个标签的字体大小提高到 14 左右,则粗体文本会比正常的加权文本大。

我的问题是:我可以使用一个设置来设置 12 点粗体文本,并将 TextFormattingMode 设置为“显示”,它的大小与正常加权文本相同/略大?

4

2 回答 2

9

问题不在于粗体文本太短,而在于普通文本太长。

这背后有历史,WPF 最初在 .NET 3.0 中发布,仅支持缩放文本的“理想”模式。此模式支持真正分辨率无关的文本缩放,在具有不同每英寸点数分辨率的各种显示设备上,一行文本将具有可预测的英寸长度。这没有得到很好的接受,它引起了 WPF 程序员的大量抱怨,他们不喜欢这样产生的模糊文本。这在您的屏幕截图中可见。请注意粗体字母 m 的左词干在理想模式下太胖,但在显示模式下却不是。

在 .NET 4.0 中,WPF 团队支持一种新的文本呈现方式,称为“显示”。它以 GDI 的方式呈现文本,应用字体提示规则来调整字母形状,使其与显示器的像素网格更好地重合。这往往会拉伸字母,尤其是当它们的词干只有一个像素时。点大小越小,这种情况就越明显。文本因此具有很高的可读性,但会丢失真正的分辨率无关渲染。

Winforms 也经历了类似的演变,从 Graphics.DrawString() 到 TextRenderer.DrawText()。

WPF 团队的这篇博客文章有详细信息。

因此,您的问题的答案是否定的。

于 2012-11-02T21:15:27.820 回答
1

不幸的是,您已经回答了您的问题。答案是不。我不确定为什么会这样。我看着它并在 SNOOP 中将其拉起,果然它变得更小了。

似乎 10.5 和 12.4 之间的所有字体设置都有这个问题。字体 8、9 或 10、10.4 和 12.5、13、14 没有。

听起来是时候联系微软了。提交一个错误。

此外,这与您的 Windows 显示设置有关。当我将显示设置从 100% 切换到 125% 时,问题发生了变化。现在它们看起来都差不多大小,而不是更小。

于 2012-11-02T19:50:58.543 回答