public static CATransition Transition(MaterialAnimationTransition type, MaterialAnimationTransitionSubType?direction = null, double?duration = null)
        {
            var animation = new CATransition();

            animation.Type = Convert.MaterialAnimationTransitionToValue(type);
            if (direction != null)
            {
                animation.Subtype = Convert.MaterialAnimationTransitionSubTypeToValue(direction.Value);
            }
            if (duration != null)
            {
                animation.Duration = duration.Value;
            }
            return(animation);
        }
        public static MaterialAnimationTransitionType MaterialAnimationTransitionToValue(MaterialAnimationTransition transition)
        {
            switch (transition)
            {
            case MaterialAnimationTransition.Fade:
                return(CATransition.TransitionFade);

            case MaterialAnimationTransition.MoveIn:
                return(CATransition.TransitionMoveIn);

            case MaterialAnimationTransition.Push:
                return(CATransition.TransitionPush);

            case MaterialAnimationTransition.Reveal:
                return(CATransition.TransitionReveal);

            default:
                return(default(MaterialAnimationTransitionType));
            }
        }