Как установить окончательное значение анимации для свойства, когда анимация заканчивается или отменяется? - PullRequest
2 голосов
/ 26 февраля 2009

Я пытаюсь анимировать свойство DependencyProperty от значения до целевого значения (в коде), и когда анимация заканчивается ( или отменяется ), задайте для свойства final . Конечным значением будет либо значение «Кому», если анимация заканчивается, либо вычисленное значение current (по анимации), когда анимация отменяется.

По умолчанию анимация не имеет такого поведения, и анимация не меняет фактическое значение, даже если оно завершено.

Неудачная попытка

Некоторое время назад я написал этот вспомогательный метод для достижения упомянутого поведения:

static void AnimateWithAutoRemoveAnimationAndSetFinalValue(IAnimatable element,
    DependencyProperty property,
    AnimationTimeline animation)
{
    var obj = element as DependencyObject;
    if (obj == null)
        throw new ArgumentException("element must be of type DependencyObject");
    EventHandler handler = null;
    handler = (sender, e) =>
    {
        var finalValue = obj.GetValue(property);
        //remove the animation
        element.BeginAnimation(property, null);
        //reset the final value
        obj.SetValue(property, finalValue);

        animation.Completed -= handler;

    };

    animation.Completed += handler;

    element.BeginAnimation(property, animation);
}

К сожалению, событие Completed, похоже, не срабатывает, если анимация удалена кем-то, вызывающим BeginAnimation (свойство, null ), и поэтому я не могу правильно установить окончательное значение при отмене анимации. Что еще хуже, я не могу удалить обработчик событий ...

Кто-нибудь знает, как это сделать чистым способом?

1 Ответ

1 голос
/ 27 февраля 2009

Похоже, вы пытаетесь установить значение обратно к начальному значению до того, как анимация начинается сразу после ее завершения. На самом деле это происходит автоматически, если вы останавливаете анимацию (или когда заканчивается анимация). Анимации в WPF могут использоваться в качестве наложения значения поверх текущего значения свойства. Остановка или удаление анимации удалит оверлей, и предыдущее значение снова начнет показываться. Исходное значение не потеряно, оно временно скрыто.

Установка свойства явно обратно к его предыдущему значению, как правило, является плохой практикой, потому что это может привести к накладным расходам памяти, если значение не было изначально установлено локально для объекта. Кроме того, это может привести к появлению тонких проблем позже. Например, если старое значение было получено из стиля, свойство больше не будет изменяться при изменении стиля.

Если вы все еще чувствуете, что должны извлечь текущее значение, а затем восстановить его, используйте ReadLocalValue () вместо GetValue (). Это вернет DepenencyProperty.UnsetValue, если значение не установлено локально. Затем вы можете условно вызвать ClearValue () или SetValue () в зависимости от того, изначально ли свойство имело локальное значение.

...