#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
значение не будет вычислено.