public void ScrollContentSmooth(int NewPosition, ScrollContentDelegate ScrollFunc) { double OldPosition = Scrollable.VRange.Span.Pos; double Position = OldPosition; double Duration = 400; // milliseconds const double AnimationSteps = 1; // animation steps Timer timer = new Timer(); double StartTime = timer.Milliseconds(); double EndTime = StartTime + Duration; double StepDuration = Duration / AnimationSteps; for (int i = 0; i < AnimationSteps; i++) { Position = OldPosition + (NewPosition - OldPosition) * (double)i / AnimationSteps; if ((timer.Milliseconds() - StartTime) / Duration <= (double)i / AnimationSteps) { ScrollFunc((int)Position); RaiseNeedRedraw(); } } ScrollFunc(NewPosition); RaiseNeedRedraw(); }