/// <summary/> protected override Rect GetCurrentValueCore(Rect baseFromValue, Rect baseToValue, AnimationClock animationClock) { var progress = animationClock.CurrentProgress; if (!progress.HasValue || Interpolator == null) { return base.GetCurrentValueCore(baseFromValue, baseToValue, animationClock); } var fromValue = new Rect(); var toValue = new Rect(); var offset = new Rect(); var isValid = true; if (From.HasValue) { fromValue = From.Value; if (To.HasValue) { // from ... to toValue = To.Value; if (IsAdditive) { offset = baseFromValue; isValid = offset.IsValid(); } } else if (By.HasValue) { // from ... from+by toValue = _add(fromValue, By.Value); if (IsAdditive) { offset = baseFromValue; isValid = offset.IsValid(); } } else { // from ... base toValue = baseToValue; isValid = toValue.IsValid(); } } else if (To.HasValue) { // base ... to fromValue = baseFromValue; toValue = To.Value; isValid = fromValue.IsValid(); } else if (By.HasValue) { // base ... base+by toValue = By.Value; offset = baseFromValue; isValid = offset.IsValid(); } else { // base ... base fromValue = baseFromValue; toValue = baseToValue; isValid = fromValue.IsValid() && toValue.IsValid(); } if (!isValid) { throw new InvalidOperationException("GetCurrentValueCore"); } if (IsCumulative) { var iteration = animationClock.CurrentIteration; if (iteration.HasValue && iteration.Value > 1) { offset = _add(_multiply(_subtract(toValue, fromValue), iteration.Value - 1), offset); } } var interpolator = Interpolator ?? Interpolators.Linear; var result = _add(_add(fromValue, _multiply(_subtract(toValue, fromValue), interpolator(progress.Value, 0.0, 1.0))), offset); return result; }