如何在呈现之前测量WPF中TextBlock的大小?

时间:2010-06-07 10:18:05

标签: wpf textblock measure

我有一个带有两个TextBlock控件(堆叠)的WPF DataTemplate,然后是一些其他元素。由于一些复杂的布局代码,我需要知道两个TextBlock元素的高度,以便我可以绘制一些花哨的连接线,并排列其他控件等。

如果我知道进入TextBlocks的文本,我知道字体等,是否有某种方法可以计算或测量这些TextBlocks的高度而不实际呈现它们?

5 个答案:

答案 0 :(得分:23)

我认为调用UIElement.Measure(Size)方法并随后检查UIElement.DesiredSize属性就足够了。有关更多信息,请查看提供的MSDN链接。

答案 1 :(得分:2)

UIElement.Measure(Size)的调用,作为参数Size。第二个调用UIElement.DesiredSize会返回您传递给Size方法的Measure

我认为情况就是这样,因为UIElement(在这种情况下为TextBlock)不是任何控制的孩子(因此),因此DesiredSize没有理由有任何不同。

答案 2 :(得分:0)

我很欣赏这是一个相当古老的问题,但我发现使用以下代码

{{1}}

dsrdSize返回{47.05,15.96}。 诀窍似乎是使msrSize大于预期的实际大小。 msrSize似乎充当DesiredSize()结果的限制。 例如,使用msrSize = new Size(10,10),这里导致dsrdSize为{10,10}。 希望这有助于某人。

答案 3 :(得分:0)

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);
}

答案 4 :(得分:0)

由于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;
}