in WPF. How to scroll Objects in ScrollViewer by mouse-dragging, like as iPhone?

前端 未结 7 831
轻奢々
轻奢々 2020-12-30 10:59

it\'s done well to scroll by mouse-wheel or scrollbar seed-dragging. but scrolling by mouse-dragging contents on scroll view is not done. How can i implement this action?

7条回答
  •  猫巷女王i
    2020-12-30 11:38

    I did this class to scroll while keeping the scrollviewer buttons. From the code from user110777, but this works with vertical instead of horizontally, and works well with the viewer (Since I'm now only capturing the content). Plus I'm using MouseLeftButtonDown instead of the preview in order to allow the user to click things like the combobox without causing a drag. (If you want label or Textblock to drag set their IsHitTestVisible=false)

    public class ScrollDragger
    {
        private readonly ScrollViewer _scrollViewer;
        private readonly UIElement _content;
        private Point _scrollMousePoint;
        private double _hOff = 1;
    
        public ScrollDragger(UIElement content, ScrollViewer scrollViewer)
        {
            _scrollViewer = scrollViewer;
            _content = content;
            content.MouseLeftButtonDown += scrollViewer_MouseLeftButtonDown;
            content.PreviewMouseMove += scrollViewer_PreviewMouseMove;
            content.PreviewMouseLeftButtonUp += scrollViewer_PreviewMouseLeftButtonUp;
        }
    
        private void scrollViewer_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _content.CaptureMouse();
            _scrollMousePoint = e.GetPosition(_scrollViewer);
            _hOff = _scrollViewer.VerticalOffset;
        }
    
        private void scrollViewer_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            if (_content.IsMouseCaptured)
            {
                var newOffset = _hOff + (_scrollMousePoint.Y - e.GetPosition(_scrollViewer).Y);
                _scrollViewer.ScrollToVerticalOffset(newOffset);
            }
        }
    
        private void scrollViewer_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _content.ReleaseMouseCapture();
        } 
    }
    

提交回复
热议问题