上一篇ListBox样式中,我们在模板中已经定义了ScroViewer,所以思路就是对它进行操作。利用
ScrollToVerticalOffset(scrollViewer.HorizonOffert+100)
进行移动水平的滚动条。也可以移动垂直的滚动条。
private int LastIndex = 0;//上一次的列表选中的索引
public void SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
{
double perWidth = 120;//ListItem的宽度
var children = VisualTreeHelper.GetChild(mainWindow.imagListBox, 0);//Border
ScrollViewer sv = VisualTreeHelper.GetChild(children, 0) as ScrollViewer;//ScrollViewer
this.mainWindow.imagListBox.UpdateLayout();
int tempInterver = 0;
tempInterver = Math.Abs(CurrentIndex - LastIndex);//索引之间的间隔
if (LastIndex > CurrentIndex)
{
sv.ScrollToHorizontalOffset(sv.HorizontalOffset - perWidth * tempInterver);
}
else
{
if ((CurrentIndex - 3) > 0)
{
sv.ScrollToHorizontalOffset(sv.HorizontalOffset + perWidth * tempInterver);
}
}
LastIndex = CurrentIndex;//当前索引
}
我们还可以设置鼠标滚轮事件,让LixtBox水平滚动
public void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewer scrollViewer = null;
ItemsControl depObj = (ItemsControl)sender;
scrollViewer = FindVisualChild<ScrollViewer>(depObj);
if (scrollViewer != null)
{
if (e.Delta > 0)
{
scrollViewer.LineRight();
}
else
{
scrollViewer.LineLeft();
}
}
e.Handled = true;
}
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}