我的WPF应用程序中有4个列表框。它们中的每一个,在任何给定的时间点都包含相等的否。其中包含String ListBoxItems。如果其中任何一个的选定索引改变,则其他三个也反映相同的行为。我想要的是,当用户移动其中一个的滚动条时,其他三个也应同时移动。
我尝试了Scrollintoview,但是如果我选择了一个列表框的项目并对其他三个列表框应用了scrollintoview,那么它就无法工作bcoz,其中所选项目位于顶部。
这就是为什么我认为滚动条运动应该是最好的选择。怎么做?
答案 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中可行,但对我来说似乎更复杂。