using System; using System.Threading; using AsyncAwaitBestPractices; using Avalonia; using Avalonia.Animation; using Avalonia.Animation.Easings; using Avalonia.Media; using Avalonia.Styling; using FluentAvalonia.UI.Media.Animation; namespace StabilityMatrix.Avalonia.Animations; public class BetterEntranceNavigationTransition : BaseTransitionInfo { public override TimeSpan Duration { get; set; } = TimeSpan.FromMilliseconds(500); /// /// Gets or sets the Horizontal Offset used when animating /// public double FromHorizontalOffset { get; set; } = 0; /// /// Gets or sets the Vertical Offset used when animating /// public double FromVerticalOffset { get; set; } = 100; public override async void RunAnimation(Animatable ctrl, CancellationToken cancellationToken) { var animation = new Animation { Easing = new SplineEasing(0.1, 0.9, 0.2, 1.0), Children = { new KeyFrame { Setters = { new Setter(Visual.OpacityProperty, 0.0), new Setter(TranslateTransform.XProperty,FromHorizontalOffset), new Setter(TranslateTransform.YProperty, FromVerticalOffset) }, Cue = new Cue(0d) }, new KeyFrame { Setters = { new Setter(Visual.OpacityProperty, 1d), new Setter(TranslateTransform.XProperty,0.0), new Setter(TranslateTransform.YProperty, 0.0) }, Cue = new Cue(1d) } }, Duration = Duration, FillMode = FillMode.Forward }; await animation.RunAsync(ctrl, cancellationToken); if (ctrl is Visual visualCtrl) { visualCtrl.Opacity = 1; } } }