1 回答

TA贡献1828条经验 获得超6个赞
查看您的 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 的底部边距。
- 1 回答
- 0 关注
- 110 浏览
添加回答
举报