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