Движение полосы прокрутки первого списка должно повлиять на движение полосы прокрутки второго списка? Но как? - PullRequest
1 голос
/ 17 ноября 2011

В моем приложении WPF есть 4 списка.Каждый из них в любой данный момент времени содержит равные нет.Строка ListBoxItems в них.Если выбранный индекс любого из них изменяется, остальные три также отражают то же поведение.Что я хочу, так это то, что когда пользователь перемещает полосу прокрутки одного из них, остальные три также должны перемещаться одновременно.

Я пробовал Scrollintoview, но он не работает, потому что я выбираю элемент из списка и применяю scrollintoview для другихтри списка, выбранный элемент в них идет сверху.

Вот почему я думаю, что движение полосы прокрутки должно быть лучшим вариантом для этого.Как это сделать?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

В XAML перехватывает событие ScrollChanged

ScrollViewer.ScrollChanged="ListBox_ScrollChanged"

В CodeBehind найдите Scrollviewers внутри ListBoxes и примените вертикальное смещение:

    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;
    }
0 голосов
/ 17 ноября 2011

Ну, в коде это что-то вроде этого:

1) получить четыре прокрутки просмотра четырех ListViews (найдя их в дочернем элементе (VisualTreeHelper.getchild) внутри метода, подобного FindDescendant (...))

2) подключить их события прокрутки (ScrollChanged) к общему сабвуферу, который получит VerticalOffset того, который вызвал событие, и ScrollToVerticalOffset (.) Других.

должно быть возможно вxaml также, но мне кажется более сложным.

...