2012-07-29 4 views
1

J'ai la méthode suivante qui fonctionne. Je voudrais le mettre dans une méthode utilitaire qui renvoie un Storyboard. Chaque tentative que j'ai faite pour convertir ceci en Storyboard a échoué, et j'ai passé beaucoup de temps à faire des recherches. Je suis prêt à abandonner à moins que quelqu'un vienne à mon secours.Convertir le code d'animation C# en storyboard

Voici le code que je veux convertir:

public override void Begin(FrameworkElement element, int duration) 
{ 
    var transform = new ScaleTransform(); 
    element.LayoutTransform = transform; 

    var animation = new DoubleAnimation 
         { 
          From = 1, 
          To = 0, 
          Duration = TimeSpan.FromMilliseconds(duration), 
          FillBehavior = FillBehavior.Stop, 
          EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn } 
         }; 

    transform.BeginAnimation(ScaleTransform.ScaleXProperty, animation); 
    transform.BeginAnimation(ScaleTransform.ScaleYProperty, animation); 
} 

Ainsi, au lieu des deux BeginAnimation() appelle, je veux revenir un storyboard donc tout ce que je dois faire est d'appeler storyboard.Begin(). Je sais que ça ne devrait pas être si difficile à faire, mais je ne comprends pas.

Merci.

EDIT: En réponse aux suggestions de HB, j'ai essayé le code suivant, qui ne fonctionne toujours pas:

private static Storyboard CreateAnimationStoryboard(FrameworkElement element, int duration) 
{ 
    var sb = new Storyboard(); 
    var scale = new ScaleTransform(1, 1); 
    element.RenderTransform = scale; 
    element.RegisterName("scale", scale); 

    var animation = new DoubleAnimation 
    { 
     From = 1, 
     To = 0, 
     Duration = TimeSpan.FromMilliseconds(duration), 
     FillBehavior = FillBehavior.Stop, 
     EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn } 
    }; 
    sb.Children.Add(animation); 

    Storyboard.SetTarget(animation, scale); 
    Storyboard.SetTargetProperty(animation, new PropertyPath(ScaleTransform.ScaleXProperty)); 

    return sb; 
} 

Je sais que je n'animais l'axe X - veulent juste obtenir quelque chose à travailler d'abord .

Répondre

0

Vous aurez besoin de deux animations puis définissez les propriétés attachées Storyboard à la propriété animée droit sur l'objet et à droite en utilisant SetTargetPropertySetTargetName.

En raison de la façon dont vous travaillez storyboards devez également définir un NameScope (NameScope.SetNameScope), inscrivez-vous le nom de la transformation, et appelez StoryBoard.Begin avec le containing element overload.

par exemple.

NameScope.SetNameScope(element, new NameScope()); 

var transform = new ScaleTransform(); 
var transformName = "transform"; 
element.RegisterName(transformName, transform); 
element.RenderTransform = transform; 

var xAnimation = new DoubleAnimation(2, TimeSpan.FromSeconds(1)); 
var yAnimation = xAnimation.Clone(); 

var storyboard = new Storyboard() 
{ 
    Children = { xAnimation, yAnimation } 
}; 

Storyboard.SetTargetProperty(xAnimation, new PropertyPath("(ScaleTransform.ScaleX)")); 
Storyboard.SetTargetProperty(yAnimation, new PropertyPath("(ScaleTransform.ScaleY)")); 

Storyboard.SetTargetName(xAnimation, transformName); 
Storyboard.SetTargetName(yAnimation, transformName); 

storyboard.Begin(element); 
+0

Oui, j'en ai eu beaucoup. Peut-être que les détails des complications que vous avez mentionnées pourraient être utiles? –

+0

@DanThomas: [This] (http://stackoverflow.com/a/4567058/546730) sonne comme le problème. –

+0

Merci, mais ce problème particulier est pour si vous créez un élément de cadre dans le code, ce que je ne fais pas. L'élément framework existe déjà via xaml, et j'appelle cette méthode via un comportement attaché. D'autres idées? :) –

0

Je suggère d'utiliser Expression Blend et commencer l'enregistrement à partir de là, il faut créer des storyboards en XAML. Plutôt que de le coder en dur avec C# et d'essayer de le traduire 1 par 1 en storyboard, cela peut être une erreur sujette à erreur.

+0

Merci, mais je dois les faire dans le code. J'ai créé un comportement que j'attache à un élément et je me lie à une propriété ViewModel qui permet au ViewModel de déclencher une transition de visibilité animée, avec un rappel sur le ViewModel quand il est fait.Je suppose qu'il est possible de créer les animations dans xaml, puisque j'ai besoin des rappels quand ils ont fini, tout est plus facile à faire dans le code. –