Как узнать высоту обернутого текстового поля?

#wpf

#wpf

Вопрос:

Мне нужно знать высоту обернутого текстового поля. Я использую этот код:

 MyView myView = new MyView();
myView.MyTextBox.Text = "my large text";
myView.UpdateLayout();

double myHeight = myView.MyTextBox.Actualheight;
  

Независимо от того, насколько велик текст, я всегда получаю 12,96 как фактическую высоту.

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

Спасибо.

РЕДАКТИРОВАТЬ: я понял, что размер зависит от размера шрифта. Сначала я установил 8, но если я установлю 16, фактическая высота тоже будет двойной. Таким образом, кажется, что высота текстового поля зависит от размера шрифта, и при этом не учитывается, обернуто оно или нет.

Ответ №1:

Запуск простого теста в XAML, когда текст переносится, это приводит к ожидаемому увеличению текстового поля ActualHeight , как показано на рисунке ниже.

 <StackPanel Orientation="Horizontal">
    <TextBox Width="100" HorizontalAlignment="Left" Margin="10"
            FontSize="10" Name="tbx1"
            TextWrapping="Wrap" Text="Some short text"/>
    <TextBlock Foreground="White" VerticalAlignment="Center"
            FontSize="20"
            Text="{Binding ActualHeight, ElementName=tbx1, Mode=OneWay}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
    <TextBox Width="100" HorizontalAlignment="Left" Margin="10"
            FontSize="10" Name="tbx2"
            TextWrapping="Wrap" Text="Some text that is longer"/>
    <TextBlock Foreground="White" VerticalAlignment="Center"
            FontSize="20"
            Text="{Binding ActualHeight, ElementName=tbx2, Mode=OneWay}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
    <TextBox Width="100" HorizontalAlignment="Left" Margin="10"
            FontSize="15" Name="tbx3"
            TextWrapping="Wrap" Text="Short text"/>
    <TextBlock Foreground="White" VerticalAlignment="Center"
            FontSize="20"
            Text="{Binding ActualHeight, ElementName=tbx3, Mode=OneWay}" />
</StackPanel>
<StackPanel Orientation="Horizontal">
    <TextBox Width="100" HorizontalAlignment="Left" Margin="10"
            FontSize="15" Name="tbx4"
            TextWrapping="Wrap" Text="Some text that is longer"/>
    <TextBlock Foreground="White" VerticalAlignment="Center"
            FontSize="20"
            Text="{Binding ActualHeight, ElementName=tbx4, Mode=OneWay}" />
</StackPanel>
  

введите описание изображения здесь

UpdateLayout на самом деле ничего не вызывает рендеринга, оно просто подготавливает это. Итак, пока вы не отобразите свой вид или окно с помощью myView.Show() или чего-то эквивалентного, текстовое поле не будет отображено, поэтому ActualHeight значение не будет вычислено.