Когда текст переносится внутри TextBlock, ActualHeight неверен
У меня есть TextBlock
с Border
вокруг него, что внутри Canvas
что я использую, чтобы оживить его как часть пользовательского элемента управления. Блок скользит от нижней части экрана поверх изображения. Я пытаюсь использовать ActualHeight
из TextBlock
чтобы определить, насколько далеко его можно переместить на страницу, но когда текста так много, что он переносится на две строки, ActualHeight
возвращает тот же размер, как если бы была одна строка.
TextBlock:
<DataTemplate DataType="{x:Type contentTypes:BusinessAdText}" x:Key="BusinessAdTextTemplate">
<Border Background="#a9a9a975"
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualWidth}">
<TextBlock Margin="20" Text="{Binding Text}"
TextWrapping="Wrap">
</TextBlock>
</Border>
</DataTemplate>
Этот стиль применяется с холстом:
<Style TargetType="local:BusinessAd">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:BusinessAd">
<Border Background="Transparent">
<Canvas ClipToBounds="True">
<ContentPresenter x:Name="PART_Content"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</Canvas>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Код для BusinessAd.cs имеет:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_contentPart = GetTemplateChild("PART_Content") as FrameworkElement;
}
Затем, просто используя простую DoubleAnimation, я перемещаю ее на экран:
if (_contentPart != null && _isLoaded)
{
_storyboard.Stop();
vAnimation.From = ActualHeight;
vAnimation.To = ActualHeight - _contentPart.ActualHeight;
//_contentPart.ActualHeight returns 46.something no matter how much text is there
vAnimation.Duration = new Duration(TimeSpan.FromSeconds(Duration));
if (_storyboard.Children.Count == 0)
{
_storyboard.Children.Add(vAnimation);
Storyboard.SetTargetProperty(vAnimation, new PropertyPath("(Canvas.Top)"));
Storyboard.SetTarget(vAnimation, _contentPart);
}
_storyboard.Begin();
}
2 ответа
Вы должны позвонить UpdateLayout()
перед проверкой ActualHeight
:
if (_contentPart != null && _isLoaded)
{
_storyboard.Stop();
UpdateLayout();
vAnimation.From = ActualHeight;
vAnimation.To = ActualHeight - _contentPart.ActualHeight;
//_contentPart.ActualHeight returns 46.something no matter how much text is there
vAnimation.Duration = new Duration(TimeSpan.FromSeconds(Duration));
if (_storyboard.Children.Count == 0)
{
_storyboard.Children.Add(vAnimation);
Storyboard.SetTargetProperty(vAnimation, new PropertyPath("(Canvas.Top)"));
Storyboard.SetTarget(vAnimation, _contentPart);
}
_storyboard.Begin();
}
Я не уверен, относится ли это к вам, но для меня текстовый блок в Windows.UI.Xaml.Controls
должно предшествовать это:
myTextBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
Раньше, когда я только что myTextBlock.Measure(new Size());
, он работал, когда не было никакого переноса текста, но с переносом ActualWidth
а также ActualHeight
возвращает размеры слова / буквы, в зависимости от WrapWholeWords или Wrap