Synchronized scrolling of two ScrollViewers whenever any one is scrolled in wpf

前端 未结 5 1761
长情又很酷
长情又很酷 2020-11-27 05:48

I have gone through the thread:

binding two VerticalScrollBars one to another

it has almost helped to achieve the goal but still there is something missing.

5条回答
  •  野性不改
    2020-11-27 06:29

    In following up on Rene Sackers code listing in C# for UWP, here is how I addressed this same issue in VB.Net for UWP with a timeout to avoid the staggering effect because of one Scroll Viewer Object firing the event because it's view was changed by the code and not by user interaction. I put a 500 Millisecond timeout period which works well for my application.

    Notes: svLvMain is a scrollviewer (for me it is the main window) svLVMainHeader is a scrollviewer (for me it is the header that goes above the main window and is what I want to track along with the main window and vice versa). Zooming or scrolling either scrollviewer will keep both scrollviewers in sync.

    Private Enum ScrollViewTrackingMasterSv
        Header = 1
        ListView = 2
        None = 0
    End Enum
    
    Private ScrollViewTrackingMaster As ScrollViewTrackingMasterSv
    Private DispatchTimerForSvTracking As DispatcherTimer    
    
    Private Sub DispatchTimerForSvTrackingSub(sender As Object, e As Object)
        ScrollViewTrackingMaster = ScrollViewTrackingMasterSv.None
        DispatchTimerForSvTracking.Stop()
    End Sub
    
    Private Sub svLvTracking(sender As Object, e As ScrollViewerViewChangedEventArgs, ByRef inMastScrollViewer As ScrollViewer)
        Dim tempHorOffset As Double
        Dim tempVerOffset As Double
        Dim tempZoomFactor As Single
    
        Dim tempSvMaster As New ScrollViewer
        Dim tempSvSlave As New ScrollViewer
    
        Select Case inMastScrollViewer.Name
            Case svLvMainHeader.Name
    
                Select Case ScrollViewTrackingMaster
                    Case ScrollViewTrackingMasterSv.Header
                        tempSvMaster = svLvMainHeader
                        tempSvSlave = svLvMain
    
                        tempHorOffset = tempSvMaster.HorizontalOffset
                        tempVerOffset = tempSvMaster.VerticalOffset
                        tempZoomFactor = tempSvMaster.ZoomFactor
    
                        tempSvSlave.ChangeView(tempHorOffset, tempVerOffset, tempZoomFactor)
    
                        If DispatchTimerForSvTracking.IsEnabled Then
                            DispatchTimerForSvTracking.Stop()
                            DispatchTimerForSvTracking.Start()
                        End If
    
                    Case ScrollViewTrackingMasterSv.ListView
    
                    Case ScrollViewTrackingMasterSv.None
                        tempSvMaster = svLvMainHeader
                        tempSvSlave = svLvMain
    
                        ScrollViewTrackingMaster = ScrollViewTrackingMasterSv.Header
                        DispatchTimerForSvTracking = New DispatcherTimer()
                        AddHandler DispatchTimerForSvTracking.Tick, AddressOf DispatchTimerForSvTrackingSub
                        DispatchTimerForSvTracking.Interval = New TimeSpan(0, 0, 0, 0, 500)
                        DispatchTimerForSvTracking.Start()
    
                        tempHorOffset = tempSvMaster.HorizontalOffset
                        tempVerOffset = tempSvMaster.VerticalOffset
                        tempZoomFactor = tempSvMaster.ZoomFactor
    
                        tempSvSlave.ChangeView(tempHorOffset, tempVerOffset, tempZoomFactor)
                End Select
    
    
            Case svLvMain.Name
    
                Select Case ScrollViewTrackingMaster
                    Case ScrollViewTrackingMasterSv.Header
    
                    Case ScrollViewTrackingMasterSv.ListView
    
                        tempSvMaster = svLvMain
                        tempSvSlave = svLvMainHeader
    
                        tempHorOffset = tempSvMaster.HorizontalOffset
                        tempVerOffset = tempSvMaster.VerticalOffset
                        tempZoomFactor = tempSvMaster.ZoomFactor
    
                        tempSvSlave.ChangeView(tempHorOffset, tempVerOffset, tempZoomFactor)
    
                        If DispatchTimerForSvTracking.IsEnabled Then
                            DispatchTimerForSvTracking.Stop()
                            DispatchTimerForSvTracking.Start()
                        End If
    
                    Case ScrollViewTrackingMasterSv.None
                        tempSvMaster = svLvMain
                        tempSvSlave = svLvMainHeader
    
                        ScrollViewTrackingMaster = ScrollViewTrackingMasterSv.ListView
                        DispatchTimerForSvTracking = New DispatcherTimer()
                        AddHandler DispatchTimerForSvTracking.Tick, AddressOf DispatchTimerForSvTrackingSub
                        DispatchTimerForSvTracking.Interval = New TimeSpan(0, 0, 0, 0, 500)
                        DispatchTimerForSvTracking.Start()
    
                        tempHorOffset = tempSvMaster.HorizontalOffset
                        tempVerOffset = tempSvMaster.VerticalOffset
                        tempZoomFactor = tempSvMaster.ZoomFactor
    
                        tempSvSlave.ChangeView(tempHorOffset, tempVerOffset, tempZoomFactor)
                End Select
    
            Case Else
                Exit Sub
    
        End Select
    
    
    End Sub
    
    
    Private Sub svLvMainHeader_ViewChanged(sender As Object, e As ScrollViewerViewChangedEventArgs) Handles svLvMainHeader.ViewChanged
    
        Call svLvTracking(sender, e, svLvMainHeader)
    
    End Sub
    
    Private Sub svLvMain_ViewChanged(sender As Object, e As ScrollViewerViewChangedEventArgs) Handles svLvMain.ViewChanged
    
        Call svLvTracking(sender, e, svLvMain)
    
    End Sub
    

提交回复
热议问题