我有一个带有两个 TextBlock 控件(堆叠)的 WPF DataTemplate,然后是下面的一些其他元素。由于一些复杂的布局代码,我需要知道两个 TextBlock 元素的高度,以便我可以绘制一些花哨的连接线,以及排列其他控件等。
如果我知道要进入 TextBlocks 的文本,并且我知道字体等,是否有某种方法可以计算或测量这些 TextBlocks 的高度而无需实际渲染它们?
UIElement.Measure(Size)
我认为调用该方法并随后检查该UIElement.DesiredSize
属性就足够了。有关详细信息,请查看提供的 MSDN 链接。
对 ,的调用UIElement.Measure(Size)
作为参数Size
。第二个调用UIElement.DesiredSize
返回Size
您传递给该Measure
方法的任何内容。
我认为是这种情况,因为UIElement
(TextBlock
在这种情况下)不是任何控制的孩子(还),因此DesiredSize
没有理由有所不同。
我很欣赏这是一个相当古老的问题,但我发现使用以下代码
TextBlock textBlock = new TextBlock();
textBlock.Text = "NR valve";
Size msrSize = new Size(100, 200);
textBlock.Measure(msrSize);
Size dsrdSize = textBlock.DesiredSize;
dsrdSize 返回为 {47.05,15.96}。诀窍似乎是使 msrSize 大于预期的实际大小。msrSize 似乎充当了 DesiredSize() 结果的限制。例如,使用 msrSize = new Size(10, 10),此处的 dsrdSize 为 {10,10}。希望这可以帮助某人。
public static Size ShapeMeasure(TextBlock tb) {
// Measured Size is bounded to be less than maxSize
Size maxSize = new Size(
double.PositiveInfinity,
double.PositiveInfinity);
tb.Measure(maxSize);
return tb.DesiredSize;
}
public static Testit()
{
TextBlock textBlock = new TextBlock();
textBlock.Text = "NR valve";
Size text size = ShapeMeasure(textBlock);
}
由于 Measure 是在 UIElement 中定义的,因此您可以测量任何 UIElement 派生对象的形状,包括 TextBlock:
public static Size ShapeMeasure(UIElement e) {
// Measured Size is bounded to be less than maxSize
Size maxSize = new Size(
double.PositiveInfinity,
double.PositiveInfinity);
e.Measure(maxSize);
return e.DesiredSize;
}