2011-08-28 2 views
2

je fait une animation pour faire tourner mon contrôle, mais quand il est trigert il saute juste position finale, puis retourne immédiatement à la position de départ.WP7 - animation se termine trop tôt et sans effet reste

Les contrôles sont faits à partir du code derrière et sont TextBoxes propriétés suivantes:

FontSize = 45; 
TextAlignment = TextAlignment.Center; 
Widh = 40; 
Heigh = 45; 

je stocke les zones de texte en tableau, donc je déclenche l'animation avec le code suivant:

foreach (TextBlock b in arrayOfTextBoxes) 
{ 
    Rotate(b); 
} 

Animation:

public static void Rotate(UIElement target) 
{ 
     var projection = new PlaneProjection(); 
     target.Projection = projection; 

     DoubleAnimation da = new DoubleAnimation(); 
     da.From = 0; 
     da.To = 90; 
     da.Duration = TimeSpan.FromSeconds(0.25); 
     da.AutoReverse = false; 

     Storyboard.SetTargetProperty(da, new PropertyPath(PlaneProjection.RotationZProperty)); 
     Storyboard.SetTarget(da, projection); 

     Storyboard sb = new Storyboard(); 
     sb.Children.Add(da); 

     EventHandler eh = null; 
     eh = (s, args) => 
     { 
      projection.RotationZ = 90; 
      sb.Stop(); 
      sb.Completed -= eh; 
     }; 
     sb.Completed += eh; 

     sb.Begin(); 
} 

EDIT: Maintenant, je sais probablement quel est le problème. J'ai un (parfois deux) Times Dispatcher en arrière-plan chaque seconde. Quand je les désactive, le problème est parti. Mais je ne peux pas le faire parce que j'ai besoin d'eux pour mesurer le temps. juste avant les stoping je déclenche l'animation et les les recommençant does'n aide. // Les DispetcherTimers font:

 void tikac_Tick(object sender, EventArgs e) 
    { 
     herniCas += new TimeSpan(0, 0, 1); 
    } 

+0

Je n'ai pas de réponse à votre question, une suggestion: vous ne devez pas créer un 'EventHandler eh' var, vous pouvez simplement utiliser à la place un délégué anonyme. – jv42

+2

@ jv42: Le motif de l'utilisation d'une variable 'eh' est généralement bonne, car elle permet au délégué retiré de l'événement une fois qu'il a été exécuté. – AnthonyWJones

+0

Juste s'assurer, vous avez l'intention pour la durée de l'animation d'être un quart de seconde, IE très rapide. Le saut à la position finale n'est pas juste parce que son animation est très rapide, puis l'exécution de votre événement storyboard terminé? –

Répondre

2

animation storyboards détiendront normalement la dernière valeur "jusqu'à ce qu'ils soient arrêtés". Ils ne modifient pas de façon permanente la valeur réelle de la propriété. Ils changent juste sa valeur actuellement rendue (dépendance ne sont pas des propriétés merveilleuses? :))

Comme vous arrêtez explicitement quand il met fin à la valeur revient à sa valeur initiale. N'arrêtez pas le storyboard si vous souhaitez que la valeur reste modifiée ou définissez-la explicitement dans le code lorsque l'animation change.

L'animation dans votre exemple est si rapide qu'elle se termine très rapidement (le temps de démarrage pour les storyboards peut être de quelques images et n'importe quel intervalle est ignoré car les animations sont des interpolations à heure fixe).