我有一个带有两个TextBlock控件(堆叠)的WPF DataTemplate,然后是一些其他元素。由于一些复杂的布局代码,我需要知道两个TextBlock元素的高度,以便我可以绘制一些花哨的连接线,并排列其他控件等。
如果我知道进入TextBlocks的文本,我知道字体等,是否有某种方法可以计算或测量这些TextBlocks的高度而不实际呈现它们?
答案 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;
}