Nikhil Agrawal
Nikhil Agrawal

Reputation: 48568

First Listbox scrollbar movement should effect Second Listbox scrollbar movement? But How?

I have 4 List Boxes in my WPF App. Each of them, at any given point of time contains equal no. of String ListBoxItems in them. If selected index of any one of them changes the other three also reflect the same behaviour. What i want is that when a user moves scrollbar of one of them the other three should also move simultaneoulsly.

I tried Scrollintoview but it does not work bcoz if i select an item of a listBox and apply scrollintoview for other three Listboxes the selected item in them come on the top.

That's why i think scrollbar movement should be the best option for this. How to do that?

Upvotes: 1

Views: 513

Answers (2)

GameAlchemist
GameAlchemist

Reputation: 19294

Well in code it is something like that :

1) get the four scrollviewers of the four ListViews ( by finding them within the child (VisualTreeHelper.getchild) inside a method like FindDescendant(...))

2) hook their scrolls events (ScrollChanged) to a common sub that will get the VerticalOffset of the one that triggered the event and ScrollToVerticalOffset(.) the others.

must be possible in xaml also, but seems more complicated to me.

Upvotes: 0

SvenG
SvenG

Reputation: 5195

In XAML hook the ScrollChanged event

ScrollViewer.ScrollChanged="ListBox_ScrollChanged"

In CodeBehind find the Scrollviewers inside the ListBoxes and apply the Vertical offset:

    private void ListBox_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
      var sourceScrollViewer = FindVisualChild<ScrollViewer>(sender as DependencyObject) as ScrollViewer;
      var targetScrollViewer = FindVisualChild<ScrollViewer>(listBox2) as ScrollViewer;
      targetScrollViewer.ScrollToVerticalOffset(sourceScrollViewer.VerticalOffset);
    }

// helper method
    private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
    {
      for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
      {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
          return (childItem)child;
        else
        {
          childItem childOfChild = FindVisualChild<childItem>(child);
          if (childOfChild != null)
            return childOfChild;
        }
      }
      return null;
    }

Upvotes: 2

Related Questions