X3

RedSky

导航

WPF 让ScrollViewer支持按住鼠标中键拖拽滚动内容

public class ScrollViewerMouseMiddleButtonDragToScrollBehavior : Behavior<UIElement>
{
    ScrollViewer target;
    private Point? _startPoint;
    protected override void OnAttached()
    {
        base.OnAttached();
        target = AssociatedObject as ScrollViewer;
        AssociatedObject.MouseMove += AssociatedObject_MouseMove;
        AssociatedObject.MouseDown += AssociatedObject_MouseDown;
        AssociatedObject.MouseUp += AssociatedObject_MouseUp;
    }
    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
        AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
        AssociatedObject.MouseUp -= AssociatedObject_MouseUp;
    }
    private void AssociatedObject_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.MiddleButton == MouseButtonState.Pressed)
        {
            _startPoint = e.GetPosition(AssociatedObject);
            Mouse.OverrideCursor = Cursors.ScrollAll; // 設定鼠標為拖動光標
            Mouse.Capture(AssociatedObject);
        }
    }
    private void AssociatedObject_MouseMove(object sender, MouseEventArgs e)
    {
        if (_startPoint.HasValue && e.MiddleButton == MouseButtonState.Pressed)
        {
            Point currentPoint = e.GetPosition(AssociatedObject);
            Vector offset = currentPoint - _startPoint.Value;
            _startPoint = currentPoint;
            target.ScrollToHorizontalOffset(target.HorizontalOffset - offset.X);
            target.ScrollToVerticalOffset(target.VerticalOffset - offset.Y);
        }
    }
    private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e)
    {
        if (e.MiddleButton == MouseButtonState.Released)
        {
            _startPoint = null;
            Mouse.OverrideCursor = null; // 恢復為默認光標
            Mouse.Capture(null);
        }
    }
}

使用方法:

Interaction.GetBehaviors(scrollviewer).Add(new ScrollViewerMouseMiddleButtonDragToScrollBehavior());

 

posted on 2026-01-27 14:57  HotSky  阅读(3)  评论(0)    收藏  举报