【问题标题】:Horizontally scrollable panel by dragging with mouse or using mousewheel通过鼠标拖动或使用鼠标滚轮水平滚动面板
【发布时间】:2017-04-11 10:47:01
【问题描述】:

我制作了一个可垂直滚动的面板,我想让它水平滚动。我的代码通过用鼠标拖动面板或使用鼠标滚轮使面板可以滚动。

这是我的代码:

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);
    }

我必须进行哪些更改才能使其按我希望的方式工作?

更新:我按照您的要求更改了代码,但它并没有按照我想要的方式工作。这就是它现在的样子(我想让它向右滚动)。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    更改以下内容...

    control.Top ->> 控制.左

    control.Height->> 控制宽度

    身高->> 宽度

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

    更新

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

    保持初始的左侧..

        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;
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多