栏目标题为listbox lb3,标题下内容为listbox lb2
#region 栏目标题栏与listboxitems左右滑动时保持同步
private void sv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ScrollViewer sv1 = Utility.FindVisualElement<ScrollViewer>(lb2);
ScrollViewer sv2 = Utility.FindVisualElement<ScrollViewer>(lb3);
sv2.ScrollToHorizontalOffset(sv1.HorizontalOffset);
}
private void sv_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
ScrollViewer sv1 = Utility.FindVisualElement<ScrollViewer>(lb2);
ScrollViewer sv2 = Utility.FindVisualElement<ScrollViewer>(lb3);
sv2.ScrollToHorizontalOffset(sv1.HorizontalOffset);
}
private void sv_LayoutUpdated(object sender, EventArgs e)
{
ScrollViewer sv1 = Utility.FindVisualElement<ScrollViewer>(lb2);
ScrollViewer sv2 = Utility.FindVisualElement<ScrollViewer>(lb3);
sv2.ScrollToHorizontalOffset(sv1.HorizontalOffset);
}
#endregion
//给lb2赋值方法中声明同步事件:
Dispatcher.BeginInvoke(() =>
{
try
{
lb2.ItemsSource = quotes;
ScrollViewer sv = FindVisualElement<ScrollViewer>(lb2);
sv.MouseLeftButtonDown += sv_MouseLeftButtonDown;
sv.MouseLeftButtonUp += sv_MouseLeftButtonUp;
sv.LayoutUpdated += sv_LayoutUpdated;
}
catch (Exception ee)
{
string e = ee.ToString();
}
});
/// <summary>
/// 查找子节点
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="container"></param>
/// <returns></returns>
public static T FindVisualElement<T>(DependencyObject container) where T : DependencyObject
{
Queue<DependencyObject> childQueue = new Queue<DependencyObject>();
childQueue.Enqueue(container);
while (childQueue.Count > 0)
{
DependencyObject current = childQueue.Dequeue();
T result = current as T;
if (result != null && result != container)
return result;
int childCount = VisualTreeHelper.GetChildrenCount(current);
for (int childIndex = 0; childIndex < childCount; childIndex++)
{
childQueue.Enqueue(VisualTreeHelper.GetChild(current, childIndex));
}
}
return null;
}