Как измерить размер текстового блока в WPF до того, как он будет отображаться?

StackOverflow https://stackoverflow.com/questions/2988622

  •  24-10-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

        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 = новый размер (10, 10), приводит к DSRDSize {10,10} здесь. Надеюсь, это кому -то поможет.

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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top