Удалить раскадровку, но сохранить анимированную ценность?

StackOverflow https://stackoverflow.com/questions/1684162

Вопрос

Как я могу удалить раскадровку в XAML (то есть действие RemovestoryBoard в DataTrigger), но сохранить анимированное значение. Похоже на Animatable.beginanimation:

Если анимация начинается NULL, любая текущая анимация будет удалена, и текущая стоимость собственности будет сохранена.

Это было полезно?

Решение

Основное использование Removestory Board-удалить анимированные значения и установить их обратно в их неанимированное состояние. В большинстве случаев вы можете просто переключить вызов на PauseStoryboard или Spotstoryboard, в зависимости от конкретного случая. Единственное исключение - когда вам нужно освободить ресурсы, удерживаемые раскадровкой или использовать ее для другой цели.

Если вы действительно хотите удалить раскадровку и сохранить значения свойства, вы должны установить анимированные значения непосредственно на свойствах. Это можно сделать, установив каждое значение для анимированного значения, что -то вроде этого:

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

  }
}

Позвоните в это прямо перед удалением раскадровки, чтобы скопировать анимированные значения.

Редактировать Был сделан комментарий, что этот код может быть ненужным, потому что призыв BERTANIMATION с BERINTIME = NULL достигает аналогичного эффекта.

Хотя это правда, что начало анализа с begintime = null выглядит так, как будто значения были скопированы в локацию, более поздний призыв к удалению емкости приведет к возвращению значений. Это связано с тем, что начало анимации с Begintime = NULL заставляет предыдущую анимацию удерживать свои значения в ожидании начала новой анимации, но ничего не делает, чтобы повлиять на локальные значения.

Приведенный выше код фактически перезаписывает локальные значения, поэтому все анимации могут быть удалены, и объекты все равно будут иметь свои новые значения. Поэтому, если вы действительно хотите вызвать removestoryboard и при этом сохранить свои значения, вам понадобится код, который я написал выше или что -то в этом роде.

Другие советы

У меня была похожая проблема при использовании AnimationTimeline. Анкет Самым простым решением оказалось захват Completed Событие в коде позади и перед вызовом BeginAnimation с null Параметр для удаления анимации, получите текущее значение свойства и используйте его для установки.

Это получает последнее анимированное значение и устанавливает его.

void OnCompleted( object sender, EventArgs args )
{
    // Required to copy latest animated value to local value.
    o.SomeValue = o.SomeValue;
    o.BeginAnimation( SomeClass.SomeValueProperty, null );
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top