Как измерить размер TextBlock в WPF до его визуализации? - PullRequest
12 голосов
/ 07 июня 2010

У меня есть шаблон данных WPF с двумя элементами управления TextBlock (в стеке) и несколькими другими элементами внизу.Из-за сложного кода компоновки мне нужно знать высоту двух элементов TextBlock, чтобы я мог рисовать некоторые причудливые соединительные линии, а также выравнивать другие элементы управления и т. Д.TextBlocks, и я знаю шрифт, и т. д., есть ли какой-нибудь способ, которым я могу вычислить или измерить высоту этих TextBlocks, фактически не представляя их?

Ответы [ 4 ]

23 голосов
/ 07 июня 2010

Я думаю, что достаточно вызвать метод UIElement.Measure(Size) и затем проверить свойство UIElement.DesiredSize. Для получения дополнительной информации проверьте предоставленные ссылки MSDN.

2 голосов
/ 02 февраля 2011

Вызов UIElement.Measure(Size), принимает в качестве параметра Size. Второй вызов UIElement.DesiredSize возвращает то, что Size вы передали в метод Measure.

Я думаю, что это так, потому что UIElement (TextBlock в данном случае) НЕ является потомком какого-либо элемента управления (пока), и поэтому DesiredSize не имеет причин быть чем-то другим.

0 голосов
/ 06 октября 2017
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);
}
0 голосов
/ 07 марта 2017

Я понимаю, что это довольно старый вопрос, но я обнаружил, что при использовании следующего кода

        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}.Надеюсь, это кому-нибудь поможет.

...