不寻常的拖动问题

时间:2011-12-20 17:33:33

标签: c# winforms drag-and-drop picturebox

我有一个Picturebox,用户可以向上或向下拖动。

有问题的节目是钢琴的复杂音乐人员编辑,因此实现工作人员笔记移动的唯一方法是通过一些if语句和修改坐标。

问题是用户无法向下移动PictureBox组件,但是当拖动对象时,没有任何反应。该类继承自PictureBox。

我只想强调PictureBox在向下拖动时有效,但在向上拖动时不会移动。拖动是间隔完成的,即PictureBox只能放置在某些位置(因此需要特定的坐标)。

1 个答案:

答案 0 :(得分:1)

您当前的解决方案有时可能有效,但是当您尝试拖动控件并将其捕捉回您在if语句中指定的坐标时,可以经常调用该事件。

建议的解决方案:

我建议您在包含要拖动控件的表单或父级中使用MouseMove事件。值也应该是可配置的,而不是硬编码的。 代码只会稍微改变一下(比较当前鼠标坐标而不是控件的LeftTop属性),它应该可以正常工作。

<强>更新

我已经更正了您的代码,所以它现在可以让您将控件放在三个位置之一( y 等于 138 148 158 )。我只是稍微改变它不要求你改变很多代码,但我强烈建议你使用所描述的第一种方法:)。

    int currentY;
    bool isDragging = false;

    private void OnDrag(object sender, MouseEventArgs e)
    {
        if (isDragging)
        {
            //calculate Y position relative to parent
            int parentY = this.Top + e.Y;

            if (parentY < currentY)
            {
                if (parentY > 158 && parentY >= 148)
                {
                    if (this.Top != 148)
                    {
                        currentY += (this.Top - 148);
                        this.Top = 148;
                    }
                }
                else if (parentY < 148 /*&& parentY >= 138*/)
                {
                    if (this.Top != 138)
                    {
                        currentY += (this.Top - 138);
                        this.Top = 138;
                    }
                }

                //And so on

            }
            else if (parentY > currentY)
            {
                if (/*parentY <= 158 &&*/ parentY >= 148)
                {
                        currentY += (this.Top - 158);
                        this.Top = 158;
                }
                else if (parentY < 148 && parentY >= 138)
                {
                        currentY += (this.Top - 148);
                        this.Top = 148;
                }

                //And so on

            }
        }
    }

    public void MusicNote_MouseDown(object sender, MouseEventArgs e)
    {
        currentY = this.Top + e.Y;

        this.Capture = true;

        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            isDragging = true;
        }

        this.MouseMove += new MouseEventHandler(OnDrag);
    }

    public void MusicNote_MouseUp(object sender, MouseEventArgs e)
    {
        isDragging = false;

        this.Capture = false;

        this.MouseMove -= new MouseEventHandler(OnDrag);
    }

然而,之前的解决方案可能会更符合您的要求。