Wpf 第一个列表框滚动条的移动会影响第二个列表框滚动条的移动吗?但是怎么做呢?

Wpf 第一个列表框滚动条的移动会影响第二个列表框滚动条的移动吗?但是怎么做呢?,wpf,wpf-controls,Wpf,Wpf Controls,我的WPF应用程序中有4个列表框。在任何给定的时间点,它们中的每个都包含相同数量的字符串ListBoxItems。如果其中任何一项的选定指数发生变化,则其他三项也反映了相同的行为。我想要的是,当用户移动其中一个的滚动条时,其他三个也应该同时移动 我尝试了Scrollintoview,但是如果我选择一个列表框中的一个项目,并将Scrollintoview应用于其他三个列表框,则它不起作用。其中的选定项目位于顶部 这就是为什么我认为滚动条移动应该是最好的选择。如何做到这一点?在代码中是这样的: 1)

我的WPF应用程序中有4个列表框。在任何给定的时间点,它们中的每个都包含相同数量的字符串ListBoxItems。如果其中任何一项的选定指数发生变化,则其他三项也反映了相同的行为。我想要的是,当用户移动其中一个的滚动条时,其他三个也应该同时移动

我尝试了Scrollintoview,但是如果我选择一个列表框中的一个项目,并将Scrollintoview应用于其他三个列表框,则它不起作用。其中的选定项目位于顶部


这就是为什么我认为滚动条移动应该是最好的选择。如何做到这一点?

在代码中是这样的:

1) 获取四个列表视图的四个滚动查看器 (通过在子对象(VisualTreeHelper.getchild)中查找它们) 在像FindDescentant(…)这样的方法中

2) 将他们的scrolls事件(ScrollChanged)挂接到一个公共子系统,该子系统 将获取触发事件的垂直偏移量 和滚动垂直偏移(.)其他


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

在xaml钩子中,ScrollChanged事件

ScrollViewer.ScrollChanged="ListBox_ScrollChanged"
在CodeBehind中,在列表框中查找滚动查看器并应用垂直偏移:

    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;
    }
private void ListBox\u ScrollChanged(对象发送者,ScrollChangedEventArgs e)
{
var sourceScrollViewer=FindVisualChild(发送方作为DependencyObject)作为ScrollViewer;
var targetScrollViewer=FindVisualChild(listBox2)作为ScrollViewer;
targetScrollViewer.ScrollToVerticalOffset(sourceScrollViewer.VerticalOffset);
}
//辅助方法
私有子项FindVisualChild(DependencyObject obj)
where-childItem:DependencyObject
{
for(int i=0;i
完美。成功了。我对它做了一点修改,以适用于所有4个列表框。我将ScrollViewer.ScrollChanged=“ListBox\u ScrollChanged”应用于所有4个函数,以重定向到单个函数,然后使用循环实现了我想要的功能