我们都知道在WPF中鼠标滚轮可以控制垂直滚动条滚动,但没有什么属性设置可以让它控制水平滚动条滚动,所以我们需要自己去实现水平滚动。
首先,在ListBox的Mousewheel事件中获得ListBox的滚动条,我发现MouseWheel事件不能被触发,所以我们要这样添加事件:
list.AddHandler(ListBox.MouseWheelEvent, new MouseWheelEventHandler(list_MouseWheel), true);
然后我们需要写一个方法获得LisBox的ScrollViewer:
public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject { if (obj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) { return (T)child; } T childItem = FindVisualChild<T>(child); if (childItem != null) return childItem; } } return null; }
在MouseWheel中写:
private void list_MouseWheel(object sender, MouseWheelEventArgs e) { ItemsControl items = (ItemsControl)sender; ScrollViewer scroll = FindVisualChild<ScrollViewer>(items); if (scroll != null) { int d = e.Delta; if (d > 0) { scroll.LineRight(); } if (d < 0) { scroll.LineLeft(); } scroll.ScrollToTop(); } }
其中,根据鼠标滚轮的变量值可以获得鼠标滚轮的滚动方向,根据滚动方向设置滚动条的滚动方向。
由于默认情况下垂直滚动条由鼠标滚轮控制,所以我们可以让垂直滚动条一直在最上方,然后隐藏垂直滚动条,就可以实现我们想要的效果!