Причина этого отложенного эффекта лежит внутри самого ScrollViewer. Каждый раз, когда вы вызываете ScrollToHorizontOffset (), он добавляет ваш запрос во внутреннюю очередь обработки, которая обрабатывается в событии LayoutUpdated. Для запуска этого события ScrollViewer делает недействительным расположение внутренних элементов управления. Только после того, как проход аранжировки завершен (ArangeOverride () обрабатывается по визуальному дереву), он вызывает событие ScrollChanged.
Переходя к вашему последнему вопросу: «Есть ли способ заставить его обновиться немедленно?», Я могу лишь посоветовать убедиться, что содержимое вашего ScrollViewer организовано как можно быстрее. Я не могу придумать другого пути, который может быть проще, чем этот ...
Может быть, если бы вы могли сказать, почему вам нужно, чтобы это событие произошло немедленно, мы можем предложить что-то лучше, чем этот ответ:)?