public static void SlideAndFade(FrameworkElement control, SlideAnimationMode mode, double from, double to)
        {
            if (mode == SlideAnimationMode.None)
            {
                return;
            }

            control.Visibility = Visibility.Hidden;

            var slideAnimation = CreateSlideAnimation(
                control.ActualWidth,
                control.ActualHeight,
                mode,
                TimeSpan);

            var fadeAnimation = CreateFadeAnimation(from, to, TimeSpan);

            var sb = new Storyboard();

            sb.Children.Add(slideAnimation);
            sb.Children.Add(fadeAnimation);

            sb.Begin(control);

            if (to == 0)
            {
                control.Visibility = Visibility.Collapsed;
            }
            else
            {
                control.Visibility = Visibility.Visible;
            }
        }
        private static void GetThicknessAnimateValue(
            double controlWidth,
            double controlHeight,
            SlideAnimationMode mode,
            out Thickness firstThickness,
            out Thickness lastThickness)
        {
            switch (mode)
            {
            case SlideAnimationMode.LeftToRight:
                firstThickness = new Thickness(-controlWidth, 0, controlWidth, 0);
                break;

            case SlideAnimationMode.RightToLeft:
                firstThickness = new Thickness(controlWidth, 0, -controlWidth, 0);
                break;

            case SlideAnimationMode.TopToBottom:
                firstThickness = new Thickness(0, -controlHeight, 0, controlHeight);
                break;

            case SlideAnimationMode.BottomToTop:
                firstThickness = new Thickness(0, controlHeight, 0, -controlHeight);
                break;

            default:
                firstThickness = new Thickness(0);
                break;
            }
            lastThickness = new Thickness(0);
        }
        public static void Slide(FrameworkElement control, SlideAnimationMode mode)
        {
            if (mode == SlideAnimationMode.None)
            {
                return;
            }


            var slideAnimation = CreateSlideAnimation(
                control.ActualWidth,
                control.ActualHeight,
                mode,
                TimeSpan);

            var sb = new Storyboard();

            sb.Children.Add(slideAnimation);

            sb.Begin(control);
        }
        /// <summary>
        /// Provides slide effect
        /// </summary>
        /// <param name="controlWidth">The width of the control applying the animation</param>
        /// <param name="animationMode">The animation mode of sliding</param>
        /// /// <param name="decelerationRatio">The ratio of timespan spent to decelerate</param>
        /// <returns>The animation</returns>
        public static ThicknessAnimation CreateSlideAnimation(
            double controlWidth,
            double controlHeight,
            SlideAnimationMode animationMode,
            double seconds,
            double decelerationRatio = 0.9f)
        {
            GetThicknessAnimateValue(controlWidth, controlHeight, animationMode, out Thickness from, out Thickness to);

            var slideAnimation = new ThicknessAnimation
            {
                From              = from,
                To                = to,
                Duration          = new Duration(System.TimeSpan.FromSeconds(seconds)),
                DecelerationRatio = decelerationRatio
            };

            Storyboard.SetTargetProperty(slideAnimation, new PropertyPath("Margin"));

            return(slideAnimation);
        }
 public static async Task SlideAndFadeAsync(FrameworkElement control, SlideAnimationMode mode, double from, double to)
 {
     SlideAndFade(control, mode, from, to);
 }
 /// <summary>
 /// Perform the animation on control in asynchorous mode
 /// </summary>
 /// <param name="control"></param>
 /// <param name="mode"></param>
 /// <returns></returns>
 public static async Task SlideAsync(FrameworkElement control, SlideAnimationMode mode)
 {
     Slide(control, mode);
 }