15

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

如果我知道要进入 TextBlocks 的文本,并且我知道字体等,是否有某种方法可以计算或测量这些 TextBlocks 的高度而无需实际渲染它们?

4

5 回答 5

28

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

于 2010-06-07T10:31:45.497 回答
2

对 ,的调用UIElement.Measure(Size)作为参数Size。第二个调用UIElement.DesiredSize返回Size您传递给该Measure方法的任何内容。

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

于 2011-02-01T21:38:09.723 回答
1

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

        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}。希望这可以帮助某人。

于 2017-03-07T17:19:44.637 回答
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);
}
于 2017-10-06T11:51:42.540 回答
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;
}
于 2020-05-28T19:33:07.883 回答