У меня есть TextBlock
с Border
вокруг него, который находится внутри Canvas
, который я использую, чтобы анимировать его как часть пользовательского элемента управления. Блок скользит в нижней части экрана в верхней части изображения. Я пытаюсь использовать ActualHeight
из TextBlock
, чтобы определить, как далеко перемещать его на страницу, но когда есть так много текста, которое оно обертывает до двух строк, 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();
}
Спасибо за ответ, но я закончил тем, что об этом совершенно по-другому. Я создал TextBlock в памяти, а затем измерил его, чтобы получить высоту. –