2016-08-26 2 views
0

У меня есть usercontrol, размещенный на форме во время выполнения. Я переживаю UserControl_MouseLeave после FormClosing.UserControl MouseLeave происходит после FormClosing

Мне интересно, должно ли это происходить при нормальных обстоятельствах.

Чтобы проверить, будет ли это происходить нормально (а не только в моем огромном проекте), я настроил тестовый проект с крошечным пользовательским контролем (только с определенной backcolor), и я не смог получить UserControl_MouseLeave событие после получения события Form_Closing. Это заставляет меня задаться вопросом, может ли мой другой пользовательский контроль просто очень долго выгружаться, поэтому сразу не уходит и, таким образом, даже остается в живых после события FormClosing.

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

Кто-нибудь знает, нормально ли это?

+0

Это совершенно нормально, просто подумайте. В событии FormClosing окно еще не закрыто. И его можно отменить. Итак, конечно, мышь фактически не оставила ваш пользовательский контроль. Это происходит не позже, когда окно действительно закрывается. Является ли пожар до или после того, как FormClosing зависит от того, как вы закрываете окно. Когда вы используете мышь, тогда, конечно, он срабатывает первым, вы перемещаете его. Когда вы, скажем, нажмете Alt + F4, затем он загорится. –

ответ

2

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

Когда форма закрыта, метод WM_CLOSE называется внутренним. Вот блок-схема алгоритма, что происходит:

Form closing flowchart

Взято из статьи MSDN Closing the Window

В WM_CLOSE, то FormClosing событие возникает в MDI детей и всех принадлежащих форм. Даже после этого все еще есть возможность отменить операцию.

Если мы продолжим закрытие, окно будет удалено с экрана (но оно все еще существует). Только после этого сообщение WM_DESTROY отправляется как самой форме, так и дочерним окнам. MSDN states that:

Во время обработки сообщения можно предположить, что все дочерние окна все еще существуют.

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

Это также вероятность того, что в коде есть что-то не так, но, не видя этого, это то, что я считаю причиной такого поведения.

Редактировать: Вы можете взглянуть на внутренности того, как форма обрабатывает все, выбирая Reference Source.

+0

Жаль, что я не мог добавить еще пару upvotes! Спасибо! – tmighty

Смежные вопросы