使用鼠标拖动或滚动鼠标滚轮来实现水平滚动面板

3
我制作了一个可以垂直滚动的面板,并希望将其变为可水平滚动。我的代码可以通过鼠标拖动或使用鼠标滚轮使面板可滚动。
这是我的代码:
private Point _mouseLastPosition;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _mouseLastPosition = e.Location;
        }
        base.OnMouseDown(e);
    }

    private int ValidateChange(int change)
    {
        var padding = -1;
        if (change < 0)
        {
            var max = (from Control control in Controls select control.Left + control.Width + padding).Concat(new[] { int.MinValue }).Max();

            if (max < Width + Math.Abs(change))
            {
                return Width - max;
            }
        }
        else
        {
            var min = (from Control control in Controls select control.Left).Concat(new[] { int.MaxValue }).Min();

            if (min > padding - Math.Abs(change))
            {
                return padding - min;
            }
        }
        return change;
    }

    private void HandleDelta(int delta)
    {
        var change = ValidateChange(delta);

        foreach (Control control in Controls)
        {
            control.Left += change;
        }

    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if ((MouseButtons & MouseButtons.Left) != 0)
        {
            var delta = _mouseLastPosition.X - e.X;
            HandleDelta(delta);
            _mouseLastPosition = e.Location;
        }
        base.OnMouseMove(e);
    }

    protected override void OnMouseWheel(MouseEventArgs e)
    {
        HandleDelta(e.Delta);
        base.OnMouseWheel(e);
    }

我需要做哪些修改才能让它按照我的意愿工作?

更新:我按照你告诉我的方法修改了代码,但它并没有按照我想要的方式工作。这是现在的样子(我希望它向右滚动)。

输入图片描述

1个回答

0

更改以下内容...

control.Top ->> control.Left

control.Height->> control.Width

Height->> Width

var delta = e.Y - _mouseLastPosition.Y; ->> var delta = _mouseLastPosition.X - e.X;

更新

这不是最好的解决方案,但你可以试试这个?

保持初始left..

    private Dictionary<string, int> dicControls;

    private bool isOverFlow;

    protected override void InitLayout()
    {
        base.InitLayout();

        if (dicControls == null)
        {
            dicControls = new Dictionary<string, int>();

            foreach (Control control in Controls)
            {
                dicControls.Add(control.Name, control.Left);
            }

            var max = (from Control control in Controls select control.Left + control.Width + -1).Concat(new[] { int.MinValue }).Max();

            isOverFlow = (Width - max) < 0;
        }
    }

    private void HandleDelta(int delta)
    {
        var change = ValidateChange(delta);

        foreach (Control control in Controls)
        {
            var initalLeft = dicControls[control.Name];

            var tempLeft = control.Left + change;

            if(isOverFlow)
            {
                if (tempLeft > initalLeft || delta > 0)
                {
                    control.Left = initalLeft;
                }
                else
                {
                    control.Left += change;
                }
            }
            else
            {
                if (tempLeft < initalLeft)
                {
                    control.Left = initalLeft;
                }
                else
                {
                    control.Left += change;
                }
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接