2

カスタムコントロールの一部としてアニメーション化するために使用してTextBlockいるのBorder中に があります。Canvasブロックは、画面の下部から画像の上部にスライドします。ActualHeightのを使用してページ上に移動する距離を決定しようとしてTextBlockいますが、テキストが多すぎて 2 行に折り返されると、 は 1 行ActualHeightと同じサイズを返します。

テキストブロック:

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

2 に答える 2

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();
}
于 2013-05-22T06:37:10.240 に答える
0

これがあなたに当てはまるかどうかはわかりませんが、私にとっては、テキストブロックのWindows.UI.Xaml.Controls前にこれを付ける必要があります:

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

以前、私がちょうど持っていたmyTextBlock.Measure(new Size());とき、テキストの折り返しがなくても機能しましたが、折り返しがあり、WrapWholeWordsまたはWrapに応じて単語/文字の寸法を返しましActualWidthActualHeight

于 2014-01-14T23:16:59.740 に答える