@@ -640,7 +640,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
640640 protected override void OnDataContextChanged ( EventArgs e )
641641 {
642642 base . OnDataContextChanged ( e ) ;
643- AutoScrollToFirstChange ( ) ;
643+ _execSizeChanged = false ;
644644 }
645645
646646 protected override void OnSizeChanged ( SizeChangedEventArgs e )
@@ -857,20 +857,40 @@ private void AutoScrollToFirstChange()
857857 if ( curBlock == null )
858858 return ;
859859
860- var lineHeight = TextArea . TextView . DefaultLineHeight ;
861- var vOffset = lineHeight * ( curBlock . Start - 1 ) - Bounds . Height * 0.5 ;
860+ ApplyTemplate ( ) ;
861+ var scroller = this . FindDescendantOfType < ScrollViewer > ( ) ;
862+ if ( scroller == null )
863+ {
864+ _execSizeChanged = false ;
865+ return ;
866+ }
867+
868+ var target = Math . Min ( curBlock . Start , Document . LineCount ) ;
869+ if ( target < 1 )
870+ return ;
871+
872+ var textView = TextArea . TextView ;
873+ for ( var i = 1 ; i < target ; i ++ )
874+ textView . GetOrConstructVisualLine ( Document . GetLineByNumber ( i ) ) ;
875+
876+ var visualLine = textView . GetOrConstructVisualLine ( Document . GetLineByNumber ( target ) ) ;
877+ var vOffset = visualLine . VisualTop - scroller . Viewport . Height * 0.5 ;
862878 if ( vOffset >= 0 )
863879 {
864- var scroller = this . FindDescendantOfType < ScrollViewer > ( ) ;
865- if ( scroller != null )
866- {
867- var scrollOffset = new Vector ( 0 , vOffset ) ;
868- scroller . Offset = scrollOffset ;
869- ctx . ScrollOffset = scrollOffset ;
870- }
880+ var scrollOffset = new Vector ( 0 , vOffset ) ;
881+ scroller . Offset = scrollOffset ;
882+ ctx . ScrollOffset = scrollOffset ;
871883 }
872884 }
873885
886+ protected void ScheduleAutoScrollToFirstChange ( )
887+ {
888+ if ( DataContext is not ViewModels . TextDiffContext )
889+ return ;
890+
891+ Dispatcher . UIThread . Post ( AutoScrollToFirstChange , DispatcherPriority . Background ) ;
892+ }
893+
874894 private bool CanCopyText ( )
875895 {
876896 var selection = TextArea . Selection ;
@@ -1061,6 +1081,8 @@ protected override void OnDataContextChanged(EventArgs e)
10611081 Text = string . Empty ;
10621082 }
10631083
1084+ ScheduleAutoScrollToFirstChange ( ) ;
1085+
10641086 GC . Collect ( ) ;
10651087 }
10661088
@@ -1252,6 +1274,8 @@ protected override void OnDataContextChanged(EventArgs e)
12521274 {
12531275 Text = string . Empty ;
12541276 }
1277+
1278+ ScheduleAutoScrollToFirstChange ( ) ;
12551279 }
12561280
12571281 protected override void UpdateSelectedChunk ( double y )
0 commit comments