Необычная проблема перетаскивания - PullRequest
1 голос
/ 20 декабря 2011

У меня есть Picturebox, который пользователь может перетаскивать вверх или вниз.

Данная программа представляет собой сложный музыкальный редактор персонала для фортепиано, и, таким образом, единственный способ добиться перемещения нот на посохе - с помощью ряда операторов if и путем изменения координат.

Проблема в том, что пользователь не может переместить компонент PictureBox вниз, но когда объект перетаскивается вверх, ничего не происходит. Класс наследуется от PictureBox.

Я просто хотел бы подчеркнуть, что PictureBox работает при перетаскивании вниз, но не перемещается при перетаскивании вверх. Перетаскивание выполняется с интервалами, то есть PictureBox может быть размещен только в определенных местах (отсюда и необходимость в определенных координатах).

1 Ответ

1 голос
/ 20 декабря 2011

Ваше текущее решение может иногда работать, однако событие может быть вызвано очень часто, когда вы пытаетесь перетащить элемент управления и привязать его к координатам, которые вы указали в операторах if.

Рекомендуетсярешение:

Я бы предложил вам использовать событие MouseMove в форме или родительском элементе, который содержит элемент управления, который вы хотите перетащить.Значения также должны быть настраиваемыми, а не жестко закодированными.Код изменился бы немного (сравнивая текущие координаты мыши вместо свойств Left и Top элемента управления), и он должен работать правильно.

ОБНОВЛЕНИЕ:

Я исправил ваш код, и теперь он работает, позволяя вам поместить элемент управления в одно из трех мест ( 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);
    }

Предыдущее решение, однако, сработало бы, вероятно, болеекак хочешь.

...