C # WinForms перетаскивая элементы управления с помощью мыши - PullRequest
3 голосов
/ 07 февраля 2011

Я делаю календарь From в C #, используя WinForms.Я собрал его, используя двумерный массив панелей, и внутри них у меня есть список <> пользовательских элементов управления, которые представляют встречи.

Пользователь должен иметь возможность перетаскивать элементы управления встречами из одной панели.другому (изо дня в день).

В пользовательском элементе управления есть событие MouseDown и MouseUp, которое передает сообщение из элемента управления в Parent.Parent (пользовательский элемент управления -> панель дня -> форма календаря).и вызывает публичные методы StartDragging () и StopDragging () соответственно.

Внутри этих методов я делаю клон пользовательского элемента управления и добавляю его в форму, и сохраняю его в глобальной переменной в форме, котораяназывается DraggedControl.

Форма имеет обработчик события для MouseMove, который выглядит следующим образом:

    void Calendar_MouseMove(object sender, MouseEventArgs e)
    {
        if (DraggedControl == null)
            return;

        DraggedControl.Location = PointToClient(MousePosition);
        Refresh();
    }

Однако есть две проблемы:

  • Прежде всегоПользовательский элемент управления находится под всем остальным.Я вижу, как он добавляется и удаляется в MouseDown и MouseUp, но он добавляется в 0,0 под панелями и надписями дня.
  • Во-вторых, он вообще не движется с MouseMove.У меня такое ощущение, что это может быть потому, что я двигаю мышь с нажатой кнопкой, и это будет представлять собой действие перетаскивания, а не простое MouseMove.

Если я удалю код MouseUp, элемент управленияперетащите мышью, однако, как только мышь войдет в панели (к сожалению, элемент управления находится под ними), действие перетаскивания прекратится.

Что бы вы предложили мне сделать?Я подозреваю, что, возможно, есть лучший способ сделать то, что я пытаюсь сделать.

1 Ответ

2 голосов
/ 07 февраля 2011

Пользовательский контроль находится под всем еще

Возьмите это на вершину:

DraggedControl.BringToFront();

похоже не движется с MouseMove вообще

Элемент управления, обработавший событие MouseDown, захватывает ввод мыши и получает все последующие события MouseMove до тех пор, пока не отпустит ввод мыши для события MouseUp, поэтому Calendar_MouseMove() не вызывается. Обрабатывать событие MouseMove для того же элемента управления, который сгенерировал событие MouseDown.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...