2010-02-09 6 views
4

Je suis en train d'essayer d'ajouter une animation flip à un contrôle utilisateur que j'ai créé. Le contrôle de l'utilisateur est simple, il a une image 87x87 avant et arrière et quelques propriétés. C'est supposé représenter une tuile dans un jeu sur lequel je travaille pour m'amuser. J'essaye d'animer un affect renversant de l'utilisateur choisissant la tuile du pont. Je pense que j'ai besoin de faire ceci par le code au lieu de xaml pour deux raisons: 1. Il y a une autre transformation après que la tuile soit retournée pour tourner la tuile (fonctionnant actuellement) 2. Après que la tuile soit retournée je veux décrocher l'événement.Exécution d'une animation Flip complètement via le code WPF

Le problème que j'obtiens est seulement la dernière animation lancée après la sortie de la méthode. Je pense que je besoin d'un storyboard, mais tous les exemples que je me regardais confus de deux façons:

Comment puis-je modifier l'image mi-story board, et qu'est-ce que je mets le TargetProperty être je travaille depuis de ces deux blogs.

http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c12221 http://blogs.msdn.com/tess/archive/2009/03/16/silverlight-wpf-flipimage-animation.aspx

public void FlipFront() 
    { 
      DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new  TimeSpan(0, 0, 1))); 
     SkewTransform skew = new SkewTransform(); 
     this.RenderTransform = skew; 
     skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);   


    } 

    public void FlipBack() 
    { 

     ImageSourceConverter source = new ImageSourceConverter(); 
     this.ImageFace.Source = new BitmapImage(new Uri("Back.jpg", UriKind.Relative)); 

     DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 1))); 
     SkewTransform skew = new SkewTransform(); 
     this.RenderTransform = skew; 
     skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    } 

    public void Flip() 
    { 
     FlipFront(); 
     FlipBack(); 
    } 

je me suis cassé basculer dans deux méthodes distinctes parce que je pensais que ce serait aider à résoudre le problème que je vis.

Répondre

1

Wow, cela n'a pas été mis à jour en un temps Loong ... juste au cas où tout le monde ce que le suivi celui-ci:

Le problème est que vous n'êtes pas en attente de l'animation « avant flip » pour terminer avant immédiatement commencer le "retour" - maintenant que vous êtes en train de sauter l'animation de l'angle Y immédiatement à 90 degrés, c'est pourquoi il semble que ça ne se déclenche pas correctement.

Il y a beaucoup de façons dont vous pouvez contourner ce - la première chose qui saute à l'esprit est que les DoubleAnimation s ont une méthode sur les a appelés CreateClock, qui vous retourner un objet AnimationClock. Cet objet a un événement Completed, qui vous indiquera quand cette animation est "terminée". Attachez un gestionnaire (souvenez-vous que vous aurez envie de le détacher de peur que vous ne fuyez la mémoire), et appelez votre méthode "commencer à retourner à l'arrière" là. J'ai jeté quelque chose de très inefficace ensemble, mais ça va montrer le principe:

public AnimationClock StartFlipFrontAnimation() 
{ 
    this.ImageFace.Source = _frontFace; 
    DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new TimeSpan(0, 0, 3))); 
    SkewTransform skew = new SkewTransform(); 
    this.RenderTransform = skew; 
    skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    return flipfront.CreateClock(); 
} 

public AnimationClock StartFlipBackAnimation() 
{ 
    this.ImageFace.Source = _backFace; 
    DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 3))); 
    SkewTransform skew = new SkewTransform(); 
    this.RenderTransform = skew; 
    skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    return flipfront.CreateClock(); 
} 

public void BeginFlip() 
{  
    var frontClk = StartFlipFrontAnimation();  
    frontClk.Completed += FrontFlipDone;   
} 

private void FrontFlipDone(object sender, EventArgs args) 
{ 
    var clk = sender as AnimationClock; 
    if(clk != null) 
    { 
     clk.Completed -= FrontFlipDone; 
    } 
    var backClk = StartFlipBackAnimation(); 
}