Допустим, у меня есть созданный класс Form и класс CustomControl.
В моей форме есть два экземпляра CustomControl и панель.
Панель имеет 4 обработчика событий: MouseEnter (чтобы задать другой курсор), MouseLeave (для сброса курсора), MouseDown (чтобы запустить поток перетаскивания) и MouseUp (чтобы убить поток перетаскивания и выполнить логику после перетаскивания) .
Я могу перетащить панель на CustomControl. Когда я делаю это, код в форме обнаруживает, что я сделал, и удаляет Panel из Form.Controls, передает некоторую мета-информацию в CustomControl, который затем создает Panel для себя.
По сути, это передача. Объект Panel теперь принадлежит CustomControl.
(Это необходимо. Сложно объяснить почему, но представьте, что у пользовательского элемента управления есть что-то вроде полос прокрутки, и необходимо, чтобы Panel принадлежала CustomControl, чтобы она прокручивалась с помощью CustomControl.)
Теперь, когда я нажимаю вниз на панели в CustomControl, вызывается MouseDown панели, она удаляется из CustomControl.Controls и отправляет некоторую мета-информацию обратно в Parent (форму), которая затем воссоздает Панель, как это было в начале - однако уже в состоянии перетаскивания , так что пользователь может переместить панель на второй CustomControl или, возможно, вернуть ее обратно в форму. Функция, которая создает Panel при первоначальной инициализации формы, - это та же самая функция, которая создает ее сейчас.
Однако MouseDown панели не был запущен. Мышь выключена , но событие не запускается, потому что мышь уже была выключена, когда она была создана. Поэтому я вручную вызываю обработчик MouseDown в функции в форме, которая принимает метаинформацию из CustomControl.
К сожалению, это только половина дела. Обработчик MouseUp не запускается. Я могу взять панель из пользовательского элемента управления и перетащить ее на форму, как и ожидалось, но когда я отпущу мышь, панель застревает в курсоре.
Я не совсем уверен, как обойти это?
Идеальным решением было бы то, что когда метаинформация передается обратно в форму и создается новая Panel, событие MouseDown каким-то образом вызывается естественным образом, как если бы пользователь только что нажал на Panel.