Когда текст переносится внутри 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

Другие вопросы по тегам