Ответ 1
Я думаю, что этого достаточно, чтобы вызвать метод UIElement.Measure(Size)
и впоследствии проверить UIElement.DesiredSize
. Для получения дополнительной информации проверьте предоставленные ссылки MSDN.
У меня есть WPF DataTemplate с двумя элементами управления TextBlock (сложены), а затем некоторые другие элементы внизу. Из-за какого-то сложного кода макета мне нужно знать высоту двух элементов TextBlock, чтобы я мог рисовать некоторые причудливые коннекторы и выстраивать другие элементы управления и т.д.
Если я знаю текст, который входит в TextBlocks, и я знаю шрифт и т.д., есть ли способ, который я могу вычислить или измерить высоту этих TextBlocks, фактически не отображая их?
Я думаю, что этого достаточно, чтобы вызвать метод 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 = new Size (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);
}