UWP:计算 RichTextBlock 中的文本高度会产生奇怪的结果

我需要一种可靠的方法来获取 a 中包含的文本的高度RichTextBlock,甚至在实际绘制到场景之前。

使用普通的 Measure() 方法会产生一个奇怪的结果,正如在 MVCE 中看到的那样:https ://github.com/cghersi/UWPExamples/tree/master/MeasureText (我想保持固定宽度,并测量最终高度,但 DesiredSize 的结果与实际高度相差甚远!!)。

出于这个原因,我找到了一个粗略的方法(在此处提到https://stackoverflow.com/a/45937298/919700),我对其进行了扩展以达到我的目的,我们使用一些 Win2D API 来计算内容高度。

问题是在某些情况下,此方法提供的高度小于预期高度。

  1. 有没有一种通用的方法来检索 TextBlock 的(正确的)高度,甚至在它被绘制到场景之前?

  2. 如果不是这种情况,我做错了什么?

这是我的代码(您也可以在这里找到 MVCE:https ://github.com/cghersi/UWPExamples/tree/master/RichText ):


守候你守候我
浏览 111回答 1
1回答

30秒到达战场

查看您的 MeasureText MVCE 代码,在 RichTextBlock 上调用 Measure() 的问题归结为这一行:    m_textBlock.Margin = new Thickness(200);这将所有边的通用边距设置为 200,这意味着元素至少需要左侧 200 宽度加上右侧 200 宽度,或 400 宽度。由于您的 Measure(300,infinite) 指定的可用宽度小于所需的最小宽度 400,因此 RichTextBlock 决定它能做的最好的事情是在每个字符处包装文本,从而产生巨大的 5740 像素高度(加上 200+200从边距的高度)。如果删除该行,RichTextBlock 将使用指定的 300 约束并将其所需高度正确测量为 90 像素,这就是它在屏幕上呈现的高度(如果设置 Width=300 或以其他方式导致实际元素布局具有相同的约束)。或者,由于您知道元素所需的宽度,您可以在其上设置 Width=300,然后它将使用该宽度进行测量。但是,高度将由于设置的边距而扩大。我假设您实际上并没有在您的真实应用程序中设置 Margin=200,而是有一些更小的东西,例如 Margin=5 来说明当 RichTextBlock 在树中和绘图时您实际想要的边距。如果是这种情况,那么您可以:使用 Width=300 方法测量并从 DesireSize.Height 中减去顶部 + 底部边距。用 (300+margin.Left+margin.Right) 作为宽度进行测量,这样一旦从总可用尺寸中减去边距,文本可以使用的剩余宽度就是您预期的 300。您仍然需要从顶部减去+ DesireSize.Height 的底部边距。
打开App,查看更多内容
随时随地看视频慕课网APP