2013-02-22 2 views
1

У меня есть 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(); 
} 

ответ

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(); 
} 
+0

Спасибо за ответ, но я закончил тем, что об этом совершенно по-другому. Я создал TextBlock в памяти, а затем измерил его, чтобы получить высоту. –

0

Я не уверен, если это относится к вам, но для меня, TextBlock в Windows.UI.Xaml.Controls потребностей должны предшествовать с этим:

myTextBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 

Раньше, когда у меня было только myTextBlock.Measure(new Size());, оно работало, когда не было никакой обертывания текста, но с оберткой ActualWidth и ActualHeight вернули измерение s слова/письма, в зависимости от WrapWholeWords или Wrap