【问题标题】:How to measure multi-line text in WPF?如何在 WPF 中测量多行文本?
【发布时间】:2018-10-17 12:19:35
【问题描述】:

标题确实说明了一切...我需要知道如何在 WPF 中测量多行文本。我真的不敢相信这个问题还没有在这里被问到。

我找到了测量 WPF 中的单行文本 (WPF equivalent to TextRenderer) 或 Windows 窗体 (C# – Measure String Width & Height (in pixels) Including Multi-line Text) 中的多行文本,但不是 WPF 中的多行文本的解决方案。我不能使用 Windows 窗体 DLL,因为我需要测量非基于 UI 的项目中的字符串,其中不欢迎 UI DLL。

为了进一步澄清,我需要的是一种方法,例如 Graphics.MeasureString 方法,我可以将设置的宽度传递给它,它将返回在 UI 中呈现字符串所需的像素高度......可以无需使用 UI 相关的 DLL 即可使用。

【问题讨论】:

  • “测量”是指检测多行文本块中的字符数?
  • 我已经更新了我的问题以澄清。
  • 如果你使用 TextBlock 或 Label 你可以使用 .ActualHeight 属性,你也可以将 MinHeight 设置为单行高度并在后面的代码中进行比较或除以该值来查找行数,TextBlock 将工作得更好,因为您有额外的文本格式选项,例如行高等
  • 正如我在问题中提到的,我需要在不欢迎 UI DLL 的非基于 UI 的项目中测量字符串。不过感谢您的回复。

标签: wpf string multiline measure


【解决方案1】:

您可以创建一个FormattedText 实例并设置其MaxTextWidth 属性,使文本换行。然后要么获取其几何形状的Bounds,要么仅从Extent 属性中获取其高度:

var testString = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor";

var formattedText = new FormattedText(
    testString,
    CultureInfo.InvariantCulture,
    FlowDirection.LeftToRight,
    new Typeface("Segoe UI"),
    20,
    Brushes.Black);

formattedText.MaxTextWidth = 200;

var bounds = formattedText.BuildGeometry(new Point(0, 0)).Bounds;
var height = formattedText.Extent;

不知道为什么heightbounds.Height 不完全相等。

【讨论】:

  • 谢谢克莱门斯。没有你我们该怎么办? ;) 然而,这段代码似乎仍然不能准确地测量字符串。我不得不增加用于获得更好结果的字体大小值,但仍然有一些字符串的测量非常差。您知道在 WPF 应用程序中测量文本的任何其他方法吗?
  • 不抱歉,这是我知道的唯一 WPF 方法。
  • 再次感谢克莱门斯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 2011-02-08
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多