Подтвердить что ты не робот

Как измерить размер TextBlock в WPF перед его визуализацией?

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

Если я знаю текст, который входит в TextBlocks, и я знаю шрифт и т.д., есть ли способ, который я могу вычислить или измерить высоту этих TextBlocks, фактически не отображая их?

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

        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

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