如何计算WPF中的字体高度?

Posted

技术标签:

【中文标题】如何计算WPF中的字体高度?【英文标题】:How to calculate font height in WPF? 【发布时间】:2011-05-29 10:03:54 【问题描述】:

对于FontFamily,我如何以编程方式检索/计算特定FontSize 处该字体的最大高度范围?

我需要一个值来设置将在指定FontSize 处显示字体的文本块的高度 - 这必须以编程方式执行。

我需要一个考虑升序和降序等的值。

更新

为了澄清,我需要整个FontFamily 的最大高度范围,而不是该字体中某些示例文本的高度。事先不知道文字会是什么。

【问题讨论】:

看看TextBox如何计算行高TextBox.GetLineHeight() 【参考方案1】:

字体的最大高度范围可以使用其LineSpacing 属性来计算,该属性是字体的比例数字。这可用于给出一个行高,该行高可以容纳该字体在特定大小的所有字形。

    FontFamily fontFamily = new FontFamily("Segoe UI");
    double fontDpiSize = 16;

    double fontHeight = Math.Ceiling(fontDpiSize * fontFamily.LineSpacing);

结果:

   22.0

此图将包含少量leading,这在需要文本行的高度时是可取的(以便相邻文本行的升序和降序具有间距)。

【讨论】:

你为什么使用Math.Ceiling()?我正在使用 Courier New 12 号尺寸,textbox.FontSize * textBox.FontFamily.LineSpacing 提供 13.59375 除了使用整数来减少定位其他元素不会变得模糊的机会之外,没有其他理由。如果使用确切的数字适合你,那就去吧。 如果您的目标是减少抗锯齿,最好使用UseLayoutRounding="True",而不是去掉 fontHeight 的小数部分。 在计算 TextBox 行的高度时不应该使用 Math.Ceiling(),因为它依赖于 TextFormattingMode。看看TextBox.GetLineHeight() 是如何计算这个值的。【参考方案2】:

使用System.Windows.Media.FormattedText 类。

示例:

FormattedText ft = new FormattedText("Quick Brown Fox Jumps Over A Lazy Dog.",
                                     CultureInfo.CurrentCulture,
                                     CultureInfo.CurrentCulture.TextInfo.IsRightToLeft ? FlowDirection.RightToLeft : FlowDirection.LeftToRight,
                                     new Typeface("Verdana"),
                                     9,
                                     new SolidColorBrush(Colors.White)
Double maxHeight = ft.MaxTextHeight;

【讨论】:

你有没有用这个例子来计算 Verdana 在 9pt 的高度范围?问题不是计算示例文本的高度,而是计算 FontFamily。 @decyclone 但是这不是计算示例文本的最大高度,即“Quick Brown Fox Jumps Over A Lazy Dog”吗? 除了所有字母之外,还有什么可能使用字符?对于计算高度,大写字母H 就足够了。 @decyclone 这甚至不是一个完整的字母表——这只是一些英文单词字符,没有考虑科学符号等。不幸的是,它并不是那么简单。我想要一些对整个 FontFamily 有效的东西,而不仅仅是示例文本。 @decyclone 法语例如有带有升序的大写字母,例如'È'。这比大写字母 H 高,例如嗬嗬。

以上是关于如何计算WPF中的字体高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算已知字体大小和字符的 WPF TextBlock 宽度?

WPF DataGrid 如何动态设置单行高度

Swift 如何从字体计算一行文本高度

给定文本和字体,如何计算 UIButton 的宽度和高度?

如何从 C# WPF 中的嵌入字体将字体文件添加到 Stimulsoft 报告

如何更改 wpf 中的字体系列? [复制]