First Listbox滚动条移动应该影响Second Listbox滚动条移动?但是怎么样?

时间:2011-11-17 12:45:35

标签: wpf wpf-controls

我的WPF应用程序中有4个列表框。它们中的每一个,在任何给定的时间点都包含相等的否。其中包含String ListBoxItems。如果其中任何一个的选定索引改变,则其他三个也反映相同的行为。我想要的是,当用户移动其中一个的滚动条时,其他三个也应同时移动。

我尝试了Scrollintoview,但是如果我选择了一个列表框的项目并对其他三个列表框应用了scrollintoview,那么它就无法工作bcoz,其中所选项目位于顶部。

这就是为什么我认为滚动条运动应该是最好的选择。怎么做?

2 个答案:

答案 0 :(得分:2)

在XAML中挂钩ScrollChanged事件

ScrollViewer.ScrollChanged="ListBox_ScrollChanged"

在Code Behind中找到ListBoxes中的Scrollviewer并应用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;
    }

答案 1 :(得分:0)

在代码中它是这样的:

1)获取四个ListView的四个滚动查看器 (通过在孩子中找到它们(VisualTreeHelper.getchild)  在像FindDescendant(...))

这样的方法中

2)将他们的滚动事件(ScrollChanged)挂钩到一个公共子 将获得触发事件的VerticalOffset 和ScrollToVerticalOffset(。)其他人。

也必须在xaml中可行,但对我来说似乎更复杂。