C # Ручной запуск MouseDown не может вызвать MouseUp - PullRequest
0 голосов
/ 15 апреля 2011

Допустим, у меня есть созданный класс 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.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2014

Посмотри на это Мгновенный пользовательский элемент управления исчезает, если щелкнуть за его пределами

У меня такая же проблема, как и у вас. Вы не должны использовать локальную переменную для обработки mouseEvent. Попробуйте использовать функцию «Захват». Это работа для меня.

0 голосов
/ 15 апреля 2011

Похоже, вы создаете новый экземпляр Panel, когда вы перемещаете его из CustomControl в форму и обратно и теряете его состояние.

Вам следует либо попытаться передать фактический экземпляр, принадлежащий Form, в CustomControl, не создавая новый, или вы можете зафиксировать состояние Panel в другом объекте, который вы можете передать конструктору при создании новой Panel, чтобы он находится в том же состоянии, что и та, которую вы перетаскивали?

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

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

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