Как вызвать раскадровку анимации задом наперед? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть анимация раскадровки, которую я хочу воспроизвести назад при определенном условии

storyboard1.autoreverse = true;

это не то, что я хочу

как будто я хочу изменить на и из полей

    <Storyboard x:Name="Storyboard1" Completed="Storyboard1_Completed">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="imageBack1">
            <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="90"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="imageBack1">
            <DiscreteObjectKeyFrame KeyTime="0:0:0.25">
                <DiscreteObjectKeyFrame.Value>
                    <Visibility>Visible</Visibility>
                </DiscreteObjectKeyFrame.Value>
            </DiscreteObjectKeyFrame>
        </ObjectAnimationUsingKeyFrames>
        <DoubleAnimation Duration="0:0:0.25" To="90" Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="image1" d:IsOptimized="True"/>
    </Storyboard>

Ответы [ 2 ]

0 голосов
/ 26 февраля 2014

Я должен вручную перевернуть раскадровку:

    // does not work.
    public static Storyboard Reverse(Storyboard storyboard)
    {
        Storyboard newStoryboard = new Storyboard();
        newStoryboard.SpeedRatio = storyboard.SpeedRatio;
        foreach (var unknownChild in storyboard.Children)
        {
            if (unknownChild is DoubleAnimation)
            {
                DoubleAnimation child = unknownChild as DoubleAnimation;
                DoubleAnimation newChild = new DoubleAnimation()
                {
                    Duration = child.Duration,
                    // AutoReverse, BeginTime, FillBehaviour, RepeatBehaviour, SpeedRatio?
                    From = child.To,
                    To = child.From,
                    EasingFunction = child.EasingFunction
                };
                Storyboard.SetTargetProperty(newChild, Storyboard.GetTargetProperty(child));
                Storyboard.SetTargetName(newChild, Storyboard.GetTargetName(child));
                newStoryboard.Children.Add(newChild);
            }
            else if (unknownChild is ObjectAnimationUsingKeyFrames)
            {
                ObjectAnimationUsingKeyFrames child = unknownChild as ObjectAnimationUsingKeyFrames;
                var newChild = new ObjectAnimationUsingKeyFrames()
                {
                    Duration = (child as Timeline).Duration,
                };
                foreach (ObjectKeyFrame keyFrame in child.KeyFrames)
                {
                    var newKeyFrame = new DiscreteObjectKeyFrame() {
                        KeyTime = KeyTime.FromTimeSpan(child.Duration.TimeSpan - keyFrame.KeyTime.TimeSpan),
                        Value = keyFrame.Value
                    };
                    newChild.KeyFrames.Add(newKeyFrame);
                }
                Storyboard.SetTargetName(newChild, Storyboard.GetTargetName(child));
                Storyboard.SetTargetProperty(newChild, Storyboard.GetTargetProperty(child));
                newStoryboard.Children.Add(newChild);
            }
            else
            {
                throw new Exception("type " + unknownChild + " not supported");
            }
        }
        return newStoryboard;
    }

Однако основная проблема, как мне кажется, заключается в том, что даже при передаче значений TargetName и TargetProperty новая раскадровка не может найти правильные элементы.1004 *

К сожалению, я не знаю, как класс Storyboard определяет его местоположение в дереве Xaml / его родительском ресурсе: /

0 голосов
/ 01 марта 2012

В фреймворке это не поддерживается, однако это легко сделать самостоятельно:

private void Reverse(Storyboard sb)
{
  DoubleAnimation anim = sb.Children.OfType<DoubleAnimation>().Single();
  object temp = anim.From;
  anim.From = anim.To;
  anim.To = Temp;
}

Что вы можете использовать следующим образом:

Reverse(this.Resources["Storyboard1"] as Storyboard);
...