Bubbling scroll events from a ListView to its parent

前端 未结 8 1440
深忆病人
深忆病人 2020-11-28 06:25

In my WPF application I have a ListView whose ScrollViewer.VerticalScrollBarVisibility is set to Disabled. It is contained within a

8条回答
  •  Happy的楠姐
    2020-11-28 07:12

    My use case was slightly different. I have a very big scrollviewer and at the bottom another scrollviewer which has a maxheight of 600. I want to scroll the whole page to the bottom until I pass scrollevents to the inner scrollviewer. This ensures you see the whole scrollviewer first, before you start scrolling.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Input;
    using System.Windows.Interactivity;
    using System.Windows.Media;
    
    namespace CleverScroller.Helper
    {
    public class ScrollParentWhenAtMax : Behavior
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            this.AssociatedObject.PreviewMouseWheel += PreviewMouseWheel;
        }
    
        protected override void OnDetaching()
        {
            this.AssociatedObject.PreviewMouseWheel -= PreviewMouseWheel;
            base.OnDetaching();
        }
    
        private void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (e.Delta < 0)
            {
                var outerscroller = GetVisualParent(this.AssociatedObject);
                if (outerscroller.ContentVerticalOffset < outerscroller.ScrollableHeight)
                {
                    e.Handled = true;
                    var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
                    e2.RoutedEvent = UIElement.MouseWheelEvent;
                    AssociatedObject.RaiseEvent(e2);
                }
            }
            else
            {
                var scrollViewer = GetVisualChild(this.AssociatedObject);
                var scrollPos = scrollViewer.ContentVerticalOffset;
                if ((scrollPos == scrollViewer.ScrollableHeight && e.Delta < 0)
                    || (scrollPos == 0 && e.Delta > 0))
                {
                    e.Handled = true;
                    var e2 = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
                    e2.RoutedEvent = UIElement.MouseWheelEvent;
                    AssociatedObject.RaiseEvent(e2);
                }
            }
        }
    
        private static T GetVisualChild(DependencyObject parent) where T : Visual
        {
            T child = default(T);
    
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                {
                    child = GetVisualChild(v);
                }
                if (child != null)
                {
                    break;
                }
            }
            return child;
        }
    
        private static T GetVisualParent(DependencyObject parent) where T : Visual
        {
            T obj = default(T);
            Visual v = (Visual)VisualTreeHelper.GetParent(parent);
            do
            {
                v = (Visual)VisualTreeHelper.GetParent(v);
                obj = v as T;
            } while (obj == null);
    
            return obj;
        }
    }
    }
    

提交回复
热议问题