You sure have put a alot of work into this issue, thank you very much!!
I still have some problems though...
When I implemented your example into my project, It seemed that the width was too large, som my columns were a bit too wide.
Maybe I have some styling that will cause that?
I tried to just decrease the width in the ScrollHelper.UpdateContentWidth() method.
Finally with some trial and error the code looks like this instead:
SetContentWidth(d, Math.Max(0, Math.Min(GetMaxTimeRulerExtent(d), GetExtentWidth(d) + GetViewportWidth(d))) - 68);
I managed to get it to look like the attached image 'without scroll'. As you can se, almost, but not quite perfect.
And when I changed visible days to 14 or 31 or even more, it was always some pixels off in some direction, either too narrow or too wide.
But the real problem came when I made my browser window smaller so it had to paint the horizontal scrollbar, then it went even more off, as you can see in image 'with scrollbar'.
And when I scrolled it, the ScheduleView did not scroll with it, as in your example, what am I missing?
So I guess just reducing the width as I did was not the answer.