HandyControl icon indicating copy to clipboard operation
HandyControl copied to clipboard

滚动条鼠标滚轮补偿

Open melinyi opened this issue 2 years ago • 3 comments

  public double MouseWheelDelta
    {
        get { return (double) GetValue(MouseWheelDeltaProperty); }
        set { SetValue(MouseWheelDeltaProperty, value); }
    }

    /// <summary>
    /// 鼠标滚动补偿
    /// </summary>
    public static readonly DependencyProperty MouseWheelDeltaProperty =
        DependencyProperty.Register("MouseWheelDelta", typeof(double), typeof(ScrollViewer), new PropertyMetadata(0d));

    protected override void OnMouseWheel(MouseWheelEventArgs e)
    {
        if (!CanMouseWheel) return;

        var mouseWheelDelta = e.Delta > 0 ? 0 - MouseWheelDelta : 0 + MouseWheelDelta;

        if (!IsInertiaEnabled)
        {
            if (Orientation == Orientation.Vertical)
            {
                base.OnMouseWheel(e);
                this.ScrollToVerticalOffset(this.VerticalOffset + mouseWheelDelta);
            }
            else
            {
                _totalHorizontalOffset = HorizontalOffset;
                CurrentHorizontalOffset = HorizontalOffset;
                _totalHorizontalOffset = Math.Min(Math.Max(0, _totalHorizontalOffset - e.Delta), ScrollableWidth);
                CurrentHorizontalOffset = _totalHorizontalOffset;
                this.ScrollToHorizontalOffset(this.HorizontalOffset + mouseWheelDelta);
            }
            return;
        }
        e.Handled = true;

        if (Orientation == Orientation.Vertical)
        {
            if (!_isRunning)
            {
                _totalVerticalOffset = VerticalOffset;
                CurrentVerticalOffset = VerticalOffset;
            }
            _totalVerticalOffset = Math.Min(Math.Max(0, _totalVerticalOffset - e.Delta), ScrollableHeight);
            ScrollToVerticalOffsetWithAnimation(_totalVerticalOffset+ mouseWheelDelta);
        }
        else
        {
            if (!_isRunning)
            {
                _totalHorizontalOffset = HorizontalOffset;
                CurrentHorizontalOffset = HorizontalOffset;
            }
            _totalHorizontalOffset = Math.Min(Math.Max(0, _totalHorizontalOffset - e.Delta), ScrollableWidth);
            ScrollToHorizontalOffsetWithAnimation(_totalHorizontalOffset+ mouseWheelDelta);
        }
    }

melinyi avatar Apr 23 '22 06:04 melinyi

默认的速率太慢了,加入了滚动补偿,大数据列表使用体验明显提高。

melinyi avatar Apr 23 '22 06:04 melinyi

为何不提 pr 呢?感觉更合适。

NaBian avatar May 25 '22 16:05 NaBian

已经提交啦

melinyi avatar May 26 '22 10:05 melinyi