Ejemplo n.º 1
0
        public async Task PopViewAsync(DefaultAnimationBehavior defaultAnimation, bool animateIn = false, bool animateOut = true, Animation otherAnimation = null)
        {
            //TODO: Exception handling
            if (CurrentIndex > 0)
            {
                // Animate transition
                await AnimateTransitioning.DefaultTransitioning(
                    CurrentView,
                    defaultAnimation,
                    false,
                    animateIn || animateOut || otherAnimation != null,
                    (animateIn)?PreviousView : null,
                    otherAnimation);

                await Task.Delay(1000);

                // After awaiting, the thread will not be on the UI thread, thus needing the dispatcher
                // Change the content view whenever the stack changes (always show the top one)
                ContentGrid.Dispatcher.BeginInvokeOnMainThread(() =>
                {
                    ContentGrid.Children.Remove(CurrentView);

                    // Remove top view from stack
                    ViewStack.Remove(CurrentView);

                    // This is the new current view after the old current view being removed
                    CurrentView.Appeared = true;
                });
            }
        }
Ejemplo n.º 2
0
        public async Task PushViewAsync(NavigatableView view, DefaultAnimationBehavior defaultAnimation, bool animateIn = true, bool animateOut = false, Animation otherAnimations = null)
        {
            // Add to stack
            ViewStack.Add(view);
            view.Parent = this;

            // Initialize the position
            if (animateIn)
            {
                view.InitializeDefaultTransitionPosition(defaultAnimation);
            }

            // Change the content view whenever the stack changes (always show the top one)
            ContentGrid.Children.Add(view);

            await AnimateTransitioning.DefaultTransitioning(
                view,
                defaultAnimation,
                true,
                animateIn || animateOut || otherAnimations != null,
                (animateOut)?PreviousView : null,
                otherAnimations);

            CurrentView.Appeared = true;
            if (PreviousView != null)
            {
                PreviousView.Appeared = false;
            }
        }
Ejemplo n.º 3
0
        public async Task SwitchView(NavigatableView view, DefaultAnimationBehavior defaultAnimation, bool animateIn = false, bool animateOut = false, Animation otherAnimations = null)
        {
            // Remove from existing stack and grid
            ContentGrid.Children.Remove(view);
            ViewStack.Remove(view);

            // push a new one
            await PushViewAsync(view, defaultAnimation, animateIn, animateOut, otherAnimations);
        }
Ejemplo n.º 4
0
 public async Task BackToPrevious(DefaultAnimationBehavior defaultAnimation = DefaultAnimationBehavior.None, bool animateIn = true, bool animateOut = false, Animation otherAnimations = null)
 {
     if (defaultAnimation == DefaultAnimationBehavior.None)
     {
         await SwitchView(PreviousView, animateIn, animateOut, otherAnimations);
     }
     else
     {
         await SwitchView(PreviousView, defaultAnimation, animateIn, animateOut, otherAnimations);
     }
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Use the default animation
        /// </summary>
        /// <param name="currentView">The current view.</param>
        /// <param name="animationBehaviour">Provide a <see cref="DefaultAnimationBehavior"/></param>
        /// <param name="AnimateIn">The current view is about to animate in or out? True: in/ False: out.</param>
        /// <param name="animation">Do the animation or not.</param>
        /// <param name="previousView">By default this is null. Provide the previous view if you want the previous view to have default animate in/out</param>
        /// <param name="otherAnimations">Other animations that need to be incorporated.</param>
        /// <param name="duration">The animation time. (in ms)</param>
        /// <returns></returns>
        public static async Task DefaultTransitioning(NavigatableView currentView, DefaultAnimationBehavior animationBehaviour, bool AnimateIn, bool animation = true, NavigatableView previousView = null, Animation otherAnimations = null, uint duration = 250)
        {
            await Task.Run(() =>
            {
                Animation totalAnimtaion        = new Animation();
                Animation currentViewAnimtaion  = new Animation();
                Animation previousViewAnimation = new Animation();
                double scaleSmall = currentView.DefaultScaleFromSmallerRatio;
                double scaleLarge = currentView.DefaultScaleFromLargerRatio;
                double fadeOutOP  = currentView.DefaultFadeOutOpacity;

                switch (animationBehaviour)
                {
                case DefaultAnimationBehavior.FadeInOut:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                    }
                    break;

                case DefaultAnimationBehavior.ScaleFromSmallAndFadeInOut:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    currentViewAnimtaion.Add(0, 1, new Animation(v => currentView.Scale = v, AnimateIn ? scaleSmall : 1, AnimateIn ? 1 : scaleLarge, Easing.SinInOut));
                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                        previousViewAnimation.Add(0, 1, new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : scaleSmall, AnimateIn ? scaleLarge : 1, Easing.SinInOut));
                    }
                    break;

                case DefaultAnimationBehavior.ScaleFromLargeAndFadeInOut:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    currentViewAnimtaion.Add(0, 1, new Animation(v => currentView.Scale = v, AnimateIn ? scaleLarge : 1, AnimateIn ? 1 : scaleLarge, Easing.SinInOut));
                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                        previousViewAnimation.Add(0, 1, new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : scaleLarge, AnimateIn ? scaleLarge : 1, Easing.SinInOut));
                    }
                    break;

                case DefaultAnimationBehavior.SlideInOutFromLeft:
                    currentViewAnimtaion = new Animation(
                        v => currentView.TranslationX = v, AnimateIn ? -currentView.Width : 0, AnimateIn ? 0 : -currentView.Width, Easing.SinInOut);

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(
                            v => previousView.TranslationX = v, AnimateIn ? 0 : previousView.Width, AnimateIn ? previousView.Width : 0, Easing.SinInOut);
                    }
                    break;

                case DefaultAnimationBehavior.SlideInOutFromRight:
                    currentViewAnimtaion = new Animation(
                        v => currentView.TranslationX = v, AnimateIn ? currentView.Width : 0, AnimateIn ? 0 : currentView.Width, Easing.SinInOut);

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(
                            v => previousView.TranslationX = v, AnimateIn ? 0 : -previousView.Width, AnimateIn ? -previousView.Width : 0, Easing.SinInOut);
                    }
                    break;

                case DefaultAnimationBehavior.SlideInOutFromTop:
                    currentViewAnimtaion = new Animation(
                        v => currentView.TranslationY = v, AnimateIn ? currentView.Height : 0, AnimateIn ? 0 : currentView.Height, Easing.SinInOut);

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(
                            v => previousView.TranslationY = v, AnimateIn ? 0 : -previousView.Height, AnimateIn ? -previousView.Height : 0, Easing.SinInOut);
                    }
                    break;

                case DefaultAnimationBehavior.SlideInOutFromBottom:
                    currentViewAnimtaion = new Animation(
                        v => currentView.TranslationY = v, AnimateIn ? -currentView.Height : 0, AnimateIn ? 0 : -currentView.Height, Easing.SinInOut);

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(
                            v => previousView.TranslationY = v, AnimateIn ? 0 : previousView.Height, AnimateIn ? previousView.Height : 0, Easing.SinInOut);
                    }
                    break;

                case DefaultAnimationBehavior.FadeAndSlideInOutFromLeft:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    currentViewAnimtaion.Add(0, 1, new Animation(
                                                 v => currentView.TranslationX = v, AnimateIn ? currentView.Width : 0, AnimateIn ? 0 : currentView.Width, Easing.SinInOut));

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                        previousViewAnimation.Add(0, 1, new Animation(
                                                      v => previousView.TranslationX = v, AnimateIn ? 0 : -previousView.Width, AnimateIn ? -previousView.Width : 0, Easing.SinInOut));
                    }
                    break;

                case DefaultAnimationBehavior.FadeAndSlideInOutFromRight:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    currentViewAnimtaion.Add(0, 1, new Animation(
                                                 v => currentView.TranslationX = v, AnimateIn ? -currentView.Width : 0, AnimateIn ? 0 : -currentView.Width, Easing.SinInOut));

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                        previousViewAnimation.Add(0, 1, new Animation(
                                                      v => previousView.TranslationX = v, AnimateIn ? 0 : previousView.Width, AnimateIn ? previousView.Width : 0, Easing.SinInOut));
                    }
                    break;

                case DefaultAnimationBehavior.FadeAndSlideInOutFromTop:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    currentViewAnimtaion.Add(0, 1, new Animation(
                                                 v => currentView.TranslationY = v, AnimateIn ? currentView.Height : 0, AnimateIn ? 0 : currentView.Height, Easing.SinInOut));

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                        previousViewAnimation.Add(0, 1, new Animation(
                                                      v => previousView.TranslationY = v, AnimateIn ? 0 : -previousView.Height, AnimateIn ? -previousView.Height : 0, Easing.SinInOut));
                    }
                    break;

                case DefaultAnimationBehavior.FadeAndSlideInOutFromBottom:
                    currentViewAnimtaion = new Animation(v => currentView.Opacity = v, AnimateIn ? fadeOutOP : 1, AnimateIn ? 1 : fadeOutOP, Easing.SinInOut);
                    currentViewAnimtaion.Add(0, 1, new Animation(
                                                 v => currentView.TranslationY = v, AnimateIn ? -currentView.Height : 0, AnimateIn ? 0 : -currentView.Height, Easing.SinInOut));

                    if (previousView != null)
                    {
                        previousViewAnimation = new Animation(v => previousView.Opacity = v, AnimateIn ? 1 : fadeOutOP, AnimateIn ? fadeOutOP : 1, Easing.SinInOut);
                        previousViewAnimation.Add(0, 1, new Animation(
                                                      v => previousView.TranslationY = v, AnimateIn ? 0 : previousView.Height, AnimateIn ? previousView.Height : 0, Easing.SinInOut));
                    }
                    break;

                default:
                    animation = false;
                    break;
                }

                if (otherAnimations != null)
                {
                    totalAnimtaion.Add(0, 1, otherAnimations);
                }

                totalAnimtaion.Add(0, 1, currentViewAnimtaion);
                if (previousView != null)
                {
                    totalAnimtaion.Add(0, 1, previousViewAnimation);
                }

                // do the animtion if needed
                if (animation)
                {
                    totalAnimtaion.Commit(currentView, nameof(DefaultTransitioning), 16, duration, Easing.SinInOut);
                }
            });
        }
        public static void InitializeDefaultTransitionPosition(this NavigatableView view, DefaultAnimationBehavior defaultAnimationBehavior, bool isAnimateIn = true)
        {
            switch (defaultAnimationBehavior)
            {
            case DefaultAnimationBehavior.FadeInOut:
                view.Opacity = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                break;

            case DefaultAnimationBehavior.ScaleFromSmallAndFadeInOut:
                view.Opacity = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                view.Scale   = isAnimateIn ? view.DefaultScaleFromSmallerRatio : 1;
                break;

            case DefaultAnimationBehavior.ScaleFromLargeAndFadeInOut:
                view.Opacity = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                view.Scale   = isAnimateIn ? view.DefaultScaleFromLargerRatio : 1;
                break;

            case DefaultAnimationBehavior.SlideInOutFromLeft:
                view.TranslationX = isAnimateIn ? -view.Width : 0;
                break;

            case DefaultAnimationBehavior.SlideInOutFromRight:
                view.TranslationX = isAnimateIn ? view.Width : 0;
                break;

            case DefaultAnimationBehavior.SlideInOutFromTop:
                view.TranslationY = isAnimateIn ? -view.Height : 0;
                break;

            case DefaultAnimationBehavior.SlideInOutFromBottom:
                view.TranslationY = isAnimateIn ? view.Height : 0;
                break;

            case DefaultAnimationBehavior.FadeAndSlideInOutFromLeft:
                view.Opacity      = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                view.TranslationX = isAnimateIn ? -view.Width : 0;
                break;

            case DefaultAnimationBehavior.FadeAndSlideInOutFromRight:
                view.Opacity      = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                view.TranslationX = isAnimateIn ? view.Width : 0;
                break;

            case DefaultAnimationBehavior.FadeAndSlideInOutFromTop:
                view.Opacity      = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                view.TranslationY = isAnimateIn ? -view.Height : 0;
                break;

            case DefaultAnimationBehavior.FadeAndSlideInOutFromBottom:
                view.Opacity      = isAnimateIn ? view.DefaultFadeOutOpacity : 1;
                view.TranslationY = isAnimateIn ? view.Height : 0;
                break;
            }
        }