Как измерить размер текстового блока в WPF до того, как он будет отображаться?
Вопрос
У меня есть 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);
}