Реализовать функцию замедления, чтобы пропустить эффект анимации в WPF C#

Как я могу пропустить анимацию, используя EasingFunction?

В моем элементе управления WPF я пытаюсь условно пропустить анимацию в уведомлении PropertyChange.

т.е. когда свойство, скажем private bool CanAnimate { get; set; } включено, уведомление PropertyChange сработает myUIEl.BeginAnimation(AnimatableProperty, doubleAnimation); оживить собственность. Но когда CanAnimate отключено, то же самое уведомление должно предотвращать анимацию (мне интересно, как этого добиться, используя BeginAnimation()).

    private static void OnPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e) {
        UIElement myUIEl = source as UIElement;
        DoubleAnimation doubleAnimation= new DoubleAnimation
            {
                From = myUIEl.AnimatablePropertyValue,
                To = offset,
                // setting 0.0 as duration is not preventing animation!
                Duration = new Duration(TimeSpan.FromMilliseconds(myUIEl.CanAnimate ? 500 : 0.0))
            };
        if (!myUIEl.CanAnimate) {
            Console.WriteLine("Preventing Animation!");
            // trying to prevent animation with Easing Function!
            doubleAnimation.EasingFunction = new SkipAnimator();
            // also tried to provide IEasingFunction.Ease() which returns 1
            // da.EasingFunction = _ => 1; // <- actual code for IEasingFunction class removed
        }
        myUIEl.BeginAnimation(AnimatableProperty, doubleAnimation);
    }

Я ожидаю, что следующая функция замедления должна анимировать свойство как на изображении ниже. Предотвратить функцию замедления анимации

    private class SkipAnimator : EasingFunctionBase
    {
        public SkipAnimator(): base()
        {
            EasingMode = EasingMode.EaseIn;
        }
        protected override Freezable CreateInstanceCore()
        {
            return new SkipAnimator();
        }

        protected override double EaseInCore(double normalizedTime)
        {
            return 1; // also tried to return (1-normalizedTime)!
        }
    }

Я пытаюсь заставить пользовательскую функцию замедления SkipAnimator всегда возвращать значение 1(конечное значение анимации), чтобы не было никакой анимации или мерцания при рендеринге промежуточных кадров. Но UIElement.BeginAnimation() всегда рендерит некоторые промежуточные кадры при переходе от начала к концу за 0 миллисекунд!

Есть ли EaseIn Режим изменения значения, возвращаемого EasingFunctionBase.EaseInCore()? Если да, то как я могу дать динамическое значение, рассчитанное из normalizedTime чтобы EasingFunctionBase.Ease() всегда возвращает 1 и предотвращает анимацию?

0 ответов

Другие вопросы по тегам