如何使用Win2D计算FontFamily的高度(行间距)?

11
我想知道如何在 Window Universal 应用程序中使用 Win2D 计算给定字体(包括其属性,如大小、粗细、样式等)的高度。
之前我使用过 CanvasTextLayout,但它需要一个文本才能工作,就像这一行代码:
var ctl = new CanvasTextLayout(session, "Some text", new CanvasTextFormat(), constraintWidth, constraintHeight);
在我的情况下,我将没有文本,因为我要找的是适应给定字体的所有字形的高度。
编辑:我也尝试过 CanvasFontFace 类,但似乎它没有任何公共构造函数。

你是否正在寻找GetGlyphRunBounds https://microsoft.github.io/Win2D/html/Overload_Microsoft_Graphics_Canvas_Text_CanvasFontFace_GetGlyphRunBounds.htm?否则,CanvasTexFormat具有FontSize属性,与字体系列一样。 - Simon Mourier
我认为GetGlyphRunBounds不是我需要的,因为我至少需要指定一个字形。这与此问题的确切等价物,在Win2D中。https://dev59.com/dW855IYBdhLWcg3wJgxy。请参见答案。在WPF中,它被称为“LineSpacing”。 - SuperJMN
我认为你无法像在WPF中那样获取默认的“LineSpacing”。你必须先绘制文本。这是Win2D的一个限制。 - Justin XL
好的,现在问题很清楚 :). CanvasTextFormat 有一个 LineSpacing 属性: https://microsoft.github.io/Win2D/html/P_Microsoft_Graphics_Canvas_Text_CanvasTextFormat_LineSpacing.htm - Simon Mourier
它具有该属性,但它始终为-1。我认为这不是我们要找的 :( - SuperJMN
1个回答

5

但是你已经朝着正确的方向迈进了。例如使用fg作为文本。其中,f代表上部区域,g代表下部区域,这样你就可以得到当前画布字体的文本总高度。


那只是一个小技巧而已 ;) - SuperJMN
也许吧,但我经常使用它而没有遇到任何问题。事实上,我还没有找到一个令人满意的替代方案。不过我非常好奇。我记得我曾经尝试用另一种方式解决这个问题,但是要么数值太小或太大,要么性能很差。 - Chris Tophski
哦,而在排版方面,“行间距”可能包括额外的高度单位,以便将多行文本设置得美观。我不确定在Wpf或类似情况下是否存在这种行间距行为的情况。如果您真的只想要实际文本高度而没有任何可能的额外空间,则此解决方案应该是正确的,因为它集中于当前字体生成的字形的度量。 - Chris Tophski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接