Question

Comment puis-je supprimer un story-board en XAML (à savoir de l'action RemoveStoryboard dans un DataTrigger), mais conserver la valeur qui a été animée. Semblable à la Animatable.BeginAnimation :

  

Si est nul, les animations actuelles seront supprimées BeginTime de l'animation et aura lieu la valeur actuelle de la propriété.

Était-ce utile?

La solution

utilisation principale de RemoveStoryboard est de supprimer les valeurs animées et les mettre à leur état non animé. Dans la plupart des cas, vous pouvez simplement passer l'appel à PauseStoryboard ou StopStoryboard au lieu, selon le cas. La seule exception est lorsque vous devez libérer des ressources détenues par le story-board ou l'utiliser dans un autre but.

Si vous voulez vraiment supprimer le story-board et conserver les valeurs de propriété, vous devez définir les valeurs d'animation directement sur les propriétés. Cela peut être fait en réglant chaque valeur à la valeur animée, quelque chose comme ceci:

void CopyAnimatedValuesToLocalValues(DependencyObject obj)
{
  // Recurse down tree
  for(int i=0; i<VisualTreeHelper.GetChildrenCount(obj); i++)
    CopyAnimatedValuesToLocalValues(VisualTreeHelper.GetChild(obj, i));

  var enumerator = obj.GetLocalValueEnumerator();
  while(enumerator.MoveNext())
  {
    var prop = enumerator.Current.Property;
    var value = enumerator.Current.Value as Freezable;

    // Recurse into eg. brushes that may be set by storyboard, as long as they aren't frozen
    if(value!=null && !value.IsFrozen)
      CopyAnimatedValuesToLocalValues(value);

    // *** This is the key bit of code ***
    if(DependencyPropertyHelper.GetValueSource(obj, prop).IsAnimated)
      obj.SetValue(prop, obj.GetValue(prop));

  }
}

Appeler ce droit avant de retirer le story-board pour copier les valeurs animées.

Modifier Un commentaire a été fait que ce code peut être inutile, car appeler BeginAnimation avec BeginTime = null obtient un effet similaire.

Il est vrai que BeginAnimation avec BeginTime = null fait, il semble que les valeurs ont été copiées au niveau local, un appel plus tard RemoveStoryboard entraînera les valeurs de revenir. En effet, avec BeginAnimation BeginTime = null provoque l'animation avant de tenir ses valeurs en attendant le début de la nouvelle animation, mais ne modifient en rien les valeurs locales.

Le code ci-dessus en fait des valeurs locales écrase, de sorte que toutes les animations peuvent être enlevés et les objets auront encore leurs nouvelles valeurs. Donc, si vous voulez vraiment appeler RemoveStoryboard et toujours garder vos valeurs, vous aurez besoin du code que j'ai écrit ci-dessus ou quelque chose comme ça.

Autres conseils

J'ai eu un problème similaire lorsque vous utilisez AnimationTimeline . La solution la plus simple est avéré être capturer l'événement Completed dans le code derrière et avant d'appeler BeginAnimation avec le paramètre null pour supprimer l'animation, obtenir la valeur actuelle de la propriété et l'utiliser pour le régler.

obtient la dernière valeur animée, et le met.

void OnCompleted( object sender, EventArgs args )
{
    // Required to copy latest animated value to local value.
    o.SomeValue = o.SomeValue;
    o.BeginAnimation( SomeClass.SomeValueProperty, null );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top