using System; using System.Numerics; using Avalonia.Animation; using Avalonia.Controls; using Avalonia.Rendering.Composition; using Avalonia.Rendering.Composition.Animations; namespace Avalonia.Xaml.Interactions.Custom; /// /// /// public static class SlidingAnimation { /// /// /// /// /// public static void SetLeft(Control element, double milliseconds) { element.Loaded += (_, _) => { Apply(element, -element.Bounds.Width, 0, TimeSpan.FromMilliseconds(milliseconds)); }; } /// /// /// /// /// public static void SetRight(Control element, double milliseconds) { element.Loaded += (_, _) => { Apply(element, 2 * element.Bounds.Width, 0, TimeSpan.FromMilliseconds(milliseconds)); }; } /// /// /// /// /// public static void SetTop(Control element, double milliseconds) { element.Loaded += (_, _) => { Apply(element, 0, -element.Bounds.Height, TimeSpan.FromMilliseconds(milliseconds)); }; } /// /// /// /// /// public static void SetBottom(Control element, double milliseconds) { element.Loaded += (_, _) => { Apply(element, 0, 2 * element.Bounds.Height, TimeSpan.FromMilliseconds(milliseconds)); }; } /// /// /// /// /// /// /// private static void Apply(Visual visual, double offsetX, double offsetY, TimeSpan duration) { var compositionVisual = ElementComposition.GetElementVisual(visual); if (compositionVisual is null) { return; } var compositor = compositionVisual.Compositor; var offsetAnimation = compositor.CreateVector3KeyFrameAnimation(); offsetAnimation.InsertKeyFrame(0.0f, new Vector3((float)offsetX, (float)offsetY, 0)); offsetAnimation.InsertKeyFrame(1.0f, new Vector3(0, 0, 0)); offsetAnimation.Direction = PlaybackDirection.Normal; offsetAnimation.Duration = duration; offsetAnimation.IterationBehavior = AnimationIterationBehavior.Count; offsetAnimation.IterationCount = 1; compositionVisual.StartAnimation("Offset", offsetAnimation); } }