0

I finally managed to sync two ListViews I had together so I'm able to scroll both at the same time.

I used the GetScrollViewer() method from this post and the sync method from this post.

Now I want to be able to scroll either of the two ListViews but when I just add another event like this:

private void SyncScrollViewers()
    {
        var scrollViewer1 = ListViewOne.GetScrollViewer();
        var scrollViewer2 = ListViewTwo.GetScrollViewer();

        if (scrollViewer1 == null || scrollViewer2 == null) return;

        scrollViewer1.ViewChanged += (s, e) =>
        {                
            scrollViewer2.ChangeView(null, scrollViewer1.VerticalOffset, null, false);
        };

        scrollViewer2.ViewChanged += (s, e) =>
        {  
            scrollViewer1.ChangeView(null, scrollViewer2.VerticalOffset, null, false);
        };
    }

It just keeps repeating the events. When I scroll ScrollViewer1 it fires the scroll event for ScrollViewer2 and when that one scrolls it fires the event for ScrollViewer1 again. Which makes scrolling the ListViews a rather wobbly sight.

Is there any way to stop the second event of firing when the sender is either ScrollViewer1or ScrollViewer2?

Daniel
  • 242
  • 2
  • 12

1 Answers1

1

In your this way to register both ViewChanged event of scrollViewer1 and scrollViewer2, the ViewChanged event of each ScrollViewer will trigger when manipulations such as scrolling and zooming have caused the view to change.

But you can operate the ViewChanged event handler to decide whether or when the ScrollViewer should scroll again as the following code.

private bool ScrollViewer1Scrolled, ScrollViewer2Scrolled;
private void SyncScrollViewers()
{
    ScrollViewer scrollViewer1 = ListViewOne.GetScrollViewer();
    ScrollViewer scrollViewer2 = ListViewTwo.GetScrollViewer();

    if (scrollViewer1 == null || scrollViewer2 == null) return;
    scrollViewer1.ViewChanged += (s, e) =>
    {
        ScrollViewer1Scrolled = true;
        if (!ScrollViewer2Scrolled)
        {
            scrollViewer2.ChangeView(null, scrollViewer1.VerticalOffset, null, false);
            Debug.WriteLine("scrollViewer2 scrolled");
        }
        ScrollViewer2Scrolled = false;
    };

    scrollViewer2.ViewChanged += (s, e) =>
    {
        ScrollViewer2Scrolled = true;
        if (!ScrollViewer1Scrolled)
        {
            scrollViewer1.ChangeView(null, scrollViewer2.VerticalOffset, null, false);
            Debug.WriteLine("scrollViewer1 scrolled");
        }
        ScrollViewer1Scrolled = false;
    };
}
Breeze Liu - MSFT
  • 3,734
  • 1
  • 10
  • 13