How to enable horizontal scrolling with mouse?

后端 未结 6 1891
旧巷少年郎
旧巷少年郎 2021-02-01 07:54

I cannot determine how to scroll horizontally using the mouse wheel. Vertical scrolling works well automatically, but I need to scroll my content horizontally. My code looks lik

6条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2021-02-01 09:00

    Here's a complete behaviour. Add the below class to your code, then in your XAML set the attached property to true on any UIElement that contains a ScrollViewer as a visual child.

    
    

    The class:

    public static class ScrollViewerHelper
    {
        public static readonly DependencyProperty ShiftWheelScrollsHorizontallyProperty
            = DependencyProperty.RegisterAttached("ShiftWheelScrollsHorizontally",
                typeof(bool),
                typeof(ScrollViewerHelper),
                new PropertyMetadata(false, UseHorizontalScrollingChangedCallback));
    
        private static void UseHorizontalScrollingChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var element = d as UIElement;
    
            if (element == null)
                throw new Exception("Attached property must be used with UIElement.");
    
            if ((bool)e.NewValue)
                element.PreviewMouseWheel += OnPreviewMouseWheel;
            else
                element.PreviewMouseWheel -= OnPreviewMouseWheel;
        }
    
        private static void OnPreviewMouseWheel(object sender, MouseWheelEventArgs args)
        {
            var scrollViewer = ((UIElement)sender).FindDescendant();
    
            if (scrollViewer == null)
                return;
    
            if (Keyboard.Modifiers != ModifierKeys.Shift)
                return;
    
            if (args.Delta < 0)
                scrollViewer.LineRight();
            else
                scrollViewer.LineLeft();
    
            args.Handled = true;
        }
    
        public static void SetShiftWheelScrollsHorizontally(ItemsControl element, bool value) => element.SetValue(ShiftWheelScrollsHorizontallyProperty, value);
        public static bool GetShiftWheelScrollsHorizontally(ItemsControl element) => (bool)element.GetValue(ShiftWheelScrollsHorizontallyProperty);
    
        [CanBeNull]
        private static T FindDescendant([CanBeNull] this DependencyObject d) where T : DependencyObject
        {
            if (d == null)
                return null;
    
            var childCount = VisualTreeHelper.GetChildrenCount(d);
    
            for (var i = 0; i < childCount; i++)
            {
                var child = VisualTreeHelper.GetChild(d, i);
    
                var result = child as T ?? FindDescendant(child);
    
                if (result != null)
                    return result;
            }
    
            return null;
        }
    }
    

    This answer fixes a few bugs in Johannes' answer, such as not filtering by Shift key, scrolling both horizontally and vertically at the same time (motion was diagonal) and the inability to disable the behaviour by setting the property to false.

提交回复
热议问题