Реализовать функцию замедления, чтобы пропустить эффект анимации в 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 и предотвращает анимацию?