/// <summary>
        /// Sets the Expression property of ExpressionAnimation by converting
        /// the given Expression to appropriate string
        /// </summary>
        /// <typeparam name="T">Type of the Expression</typeparam>
        /// <param name="animation">ExpressionAnimation</param>
        /// <param name="expression">Expression</param>
        /// <returns>Dictionary of parameter names and the parameters</returns>
        public static void SetExpression <T>(this ExpressionAnimation animation,
                                             Expression <CompositionExpression <T> > expression)
        {
            var result = CompositionExpressionEngine.CreateCompositionExpression(expression);

            animation.Expression = result.Expression;
            animation.SetParameters(result.Parameters);
        }
        /// <summary>
        /// Sets the Expression property of ExpressionAnimation by converting
        /// the given Expression to appropriate string
        /// </summary>
        /// <typeparam name="T">Type of the Expression</typeparam>
        /// <param name="animation">ExpressionAnimation</param>
        /// <param name="expression">Expression</param>
        /// <returns>Dictionary of parameter names and the parameters</returns>
        public static Dictionary <string, object> SetExpression <T>(this ExpressionAnimation animation,
                                                                    Expression <CompositionLambda <T> > expression)
        {
            var result = CompositionExpressionEngine.CreateCompositionExpression(expression);

            animation.Expression = result.Expression;
            animation.SetParameters(result.Parameters);

            return(result.Parameters);
        }
        /// <summary>
        /// Inserts a KeyFrame in the KeyFrameAnimation by converting
        /// the given Expression to appropriate string
        /// </summary>
        /// <typeparam name="T">Type of the Expression</typeparam>
        /// <param name="animation">KeyFrameAnimation</param>
        /// <param name="normalizedProgressKey">The time the key frame should occur at, expressed as
        /// a percentage of the animation Duration. Allowed value is from 0.0 to 1.0.</param>
        /// <param name="expression">The expression used to calculate the value of the key frame.</param>
        /// <param name="easingFunction">Easing Function (optional)</param>
        /// <returns>KeyFrameAnimation</returns>
        public static KeyFrameAnimation InsertExpressionKeyFrame <T>(this KeyFrameAnimation animation, float normalizedProgressKey,
                                                                     Expression <CompositionLambda <T> > expression, CompositionEasingFunction easingFunction = null)
        {
            var result = CompositionExpressionEngine.CreateCompositionExpression(expression);

            animation.InsertExpressionKeyFrame(normalizedProgressKey, result.Expression, easingFunction);
            animation.SetParameters(result.Parameters);

            return(animation);
        }
        /// <summary>
        /// Creates an ExpressionAnimation based on the given CompositionLambda Expression
        /// </summary>
        /// <typeparam name="T">Type of the CompositionLambda Expression</typeparam>
        /// <param name="compositor">Compositor</param>
        /// <param name="expression">CompositionLambda Expression</param>
        /// <returns>ExpressionAnimation</returns>
        public static ExpressionAnimation CreateExpressionAnimation <T>(this Compositor compositor,
                                                                        Expression <CompositionLambda <T> > expression)
        {
            var result    = CompositionExpressionEngine.CreateCompositionExpression(expression);
            var animation = compositor.CreateExpressionAnimation();

            animation.Expression = result.Expression;
            animation.SetParameters(result.Parameters);

            return(animation);
        }
 /// <summary>
 /// Stops the given animation on the property specified by the given expression.
 /// The expression is converted to the appropriate property string by the
 /// CompositionExpressionEngine
 /// </summary>
 /// <param name="compositionObject">CompositionObject</param>
 /// <param name="expression">Expression defining the property on which to stop the animation</param>
 public static void StopAnimation(this CompositionObject compositionObject,
                                  Expression <Func <object> > expression)
 {
     compositionObject.StopAnimation(CompositionExpressionEngine.ParseExpression(expression));
 }
 /// <summary>
 /// Starts the given KeyFrameAnimation&lt;&gt; on the property specified by the given expression.
 /// The expression is converted to the appropriate property string by the
 /// CompositionExpressionEngine
 /// </summary>
 /// <typeparam name="T">Type of the property to be animated.</typeparam>
 /// <param name="compositionObject">CompositionObject</param>
 /// <param name="expression">Lambda expression defining the property on
 /// which the animation has to be started.</param>
 /// <param name="keyframeAnimation">The KeyFrameAnimation to run on the specified property.</param>
 public static void StartAnimation <T>(this CompositionObject compositionObject,
                                       Expression <Func <T> > expression, KeyFrameAnimation <T> keyframeAnimation)
 {
     compositionObject.StartAnimation(CompositionExpressionEngine.ParseExpression(expression), keyframeAnimation.Animation);
 }
 /// <summary>
 /// Sets the target for the encapsulated KeyFrameAnimation object
 /// </summary>
 /// <param name="targetExpression">Expression for the target</param>
 /// <returns>KeyFrameAnimation&lt;T&gt;</returns>
 public KeyFrameAnimation <T> ForTarget(Expression <Func <object> > targetExpression)
 {
     Animation.Target = CompositionExpressionEngine.ParseExpression(targetExpression);
     return(this);
 }
 /// <summary>
 /// Adds a KeyFrameAnimation&lt;T&gt; to the specified ImplicitAnimationCollection.
 /// </summary>
 /// <typeparam name="T">Type of the property being animated.</typeparam>
 /// <param name="implicitAnimationCollection">ImplicitAnimationCollection</param>
 /// <param name="key">The key specifying the property being targeted with the
 /// specified ImplicitAnimationCollection.</param>
 /// <param name="keyframeAnimation">KeyFrameAnimation&lt;T&gt;</param>
 public static void Add <T>(this ImplicitAnimationCollection implicitAnimationCollection,
                            Expression <Func <T> > key,
                            KeyFrameAnimation <T> keyframeAnimation)
 {
     implicitAnimationCollection.Add(CompositionExpressionEngine.ParseExpression(key), keyframeAnimation.Animation);
 }