/// <summary>
        /// 新しいプロパティの値を取得します。
        /// </summary>
        protected override object UpdateProperty(TimeSpan frameTime)
        {
            DoubleKeyFrame prev, curr;

            if (!KeyFrameUtil.FindKeyFrame(KeyFrames, frameTime,
                                           out prev, out curr))
            {
                throw new EffectException(
                          frameTime + ": この時刻に対応するキーフレームが見つかりません。");
            }

            // prevがnullの場合は番兵としてデフォルト値を設定します。
            if (prev == null)
            {
                prev = DoubleKeyFrameZero;
            }

            // 区間が0の場合は新しい方の値を使います。
            if (prev.KeyTime == curr.KeyTime)
            {
                return(curr.Value);
            }

            // 進行度などを計算します。
            var progress = (frameTime - prev.KeyTime).TotalSeconds;
            var total    = (curr.KeyTime - prev.KeyTime).TotalSeconds;
            var rate     = progress / total;

            // 一つ前のキーフレームを使用して補間値を求めます。
            return(curr.Interpolate(prev.Value, rate));
        }
        /// <summary>
        /// アニメーション開始時に呼ばれます。
        /// </summary>
        protected override void OnBegin(object target)
        {
            // KeyFramesがKeyTime順に並んでいなければ例外を返します。
            KeyFrameUtil.ValidateKeyFrames(KeyFrames);

            // アニメーション期間は最後のキーフレーム時刻とします。
            var keyFrame = KeyFrames.LastOrDefault();

            if (keyFrame != null)
            {
                Duration = keyFrame.KeyTime;
            }

            base.OnBegin(target);
        }