@@ -848,15 +848,15 @@ private void SetupScrollSync()
848848 var theirsScroll = _theirsPresenter ? . GetScrollViewer ( ) ;
849849 var resultScroll = _resultPresenter ? . GetScrollViewer ( ) ;
850850
851- // Wheel events
851+ // Wheel events for scroll sync
852852 if ( _oursPresenter != null )
853853 _oursPresenter . AddHandler ( PointerWheelChangedEvent , OnPresenterPointerWheelChanged , RoutingStrategies . Tunnel ) ;
854854 if ( _theirsPresenter != null )
855855 _theirsPresenter . AddHandler ( PointerWheelChangedEvent , OnPresenterPointerWheelChanged , RoutingStrategies . Tunnel ) ;
856856 if ( _resultPresenter != null )
857857 _resultPresenter . AddHandler ( PointerWheelChangedEvent , OnPresenterPointerWheelChanged , RoutingStrategies . Tunnel ) ;
858858
859- // ScrollChanged for scrollbar drag
859+ // ScrollChanged for scrollbar drag sync
860860 if ( oursScroll != null )
861861 oursScroll . ScrollChanged += OnScrollChanged ;
862862 if ( theirsScroll != null )
@@ -865,6 +865,15 @@ private void SetupScrollSync()
865865 resultScroll . ScrollChanged += OnScrollChanged ;
866866 }
867867
868+ private void OnScrollChanged ( object sender , ScrollChangedEventArgs e )
869+ {
870+ if ( _isSyncingScroll || sender is not ScrollViewer source )
871+ return ;
872+
873+ // Sync on any scroll change (scrollbar drag, programmatic, etc.)
874+ SyncAllScrollViewers ( source . Offset ) ;
875+ }
876+
868877 private void OnPresenterPointerWheelChanged ( object sender , PointerWheelEventArgs e )
869878 {
870879 var oursScroll = _oursPresenter ? . GetScrollViewer ( ) ;
@@ -879,34 +888,27 @@ private void OnPresenterPointerWheelChanged(object sender, PointerWheelEventArgs
879888 e . Handled = true ;
880889 }
881890
882- private void OnScrollChanged ( object sender , ScrollChangedEventArgs e )
891+ private void SyncAllScrollViewers ( Vector offset )
883892 {
884- if ( _isSyncingScroll || sender is not ScrollViewer source )
893+ if ( _isSyncingScroll )
885894 return ;
886895
887- // Only sync if significant movement (scrollbar drag)
888- if ( e . OffsetDelta . SquaredLength > 0.5f )
889- {
890- SyncAllScrollViewers ( source . Offset ) ;
891- }
892- }
893-
894- private void SyncAllScrollViewers ( Vector offset )
895- {
896896 _isSyncingScroll = true ;
897897 try
898898 {
899899 var oursScroll = _oursPresenter ? . GetScrollViewer ( ) ;
900900 var theirsScroll = _theirsPresenter ? . GetScrollViewer ( ) ;
901901 var resultScroll = _resultPresenter ? . GetScrollViewer ( ) ;
902902
903+ // Direct offset assignment for immediate sync
903904 if ( oursScroll != null )
904905 oursScroll . Offset = offset ;
905906 if ( theirsScroll != null )
906907 theirsScroll . Offset = offset ;
907908 if ( resultScroll != null )
908909 resultScroll . Offset = offset ;
909910
911+ // Also update ViewModel for state tracking
910912 if ( DataContext is ViewModels . MergeConflictEditor vm )
911913 vm . ScrollOffset = offset ;
912914 }
0 commit comments