代码之家  ›  专栏  ›  技术社区  ›  Scott Whitlock

在呈现文本块之前,如何在WPF中测量它的大小?

  •  12
  • Scott Whitlock  · 技术社区  · 14 年前

    我有一个包含两个文本块控件(堆叠)的WPF数据模板,下面还有一些其他元素。由于一些复杂的布局代码,我需要知道两个textBlock元素的高度,以便绘制一些花哨的连接线,以及排列其他控件等。

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

    4 回复  |  直到 14 年前
        1
  •  23
  •   gehho    14 年前

    我觉得打电话给 UIElement.Measure(Size) 方法并随后检查 UIElement.DesiredSize 财产。有关详细信息,请查看提供的msdn链接。

        2
  •  2
  •   durron597    12 年前

    呼唤 UIElement.Measure(Size) ,作为参数 Size . 第二次呼叫 UIElement.DesiredSize 返回任何内容 尺寸 你进入了 Measure 方法。

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

        3
  •  0
  •   jetbadger    7 年前

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

            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。 希望这能帮助别人。

        4
  •  0
  •   Bimo    7 年前
    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);
    }