2012-03-01 2 views
0

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

раскадровка1.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> 

ответ

0

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

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

У меня есть некоторые сомнения по поводу этого решения, потому что вы должны были бы изменить/реверс ключевых кадров, а также. –

+0

@ColinE: не могли бы вы быть более конкретными, увидев код, который я опубликовал, предположим, что хочу сделать «imageBack1» на «image1» и наоборот. – user1235555

+0

@Emo хороший пункт. Однако мое утверждение о том, что «нет поддержки для этого в рамках», является важным моментом в моем ответе. Вы должны сделать это самостоятельно, отредактировав StoryBoard. – ColinE

0

Я вручную реверс раскадровки:

// 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; 
    } 

Однако главная проблема, кажется, что даже если я передать значение Имя_целевого_объекта и TargetProperty, новая раскадровка не может найти правильные элементы.

К сожалению, я не знаю, как эти цифры раскадровки класса из его расположения в Xaml Tree/это ресурсы Родитель:/

Смежные вопросы