2013-08-09 4 views
0

У меня довольно большое приложение C# Forms. Есть MdiParent, который контролирует множество MdiChild. Я также создал «экран загрузки», который прыгает всегда сверху, когда пользователь открывает формы, требующие некоторого времени загрузки.Выполнить код каждый раз, когда отображается сообщение

Дело в том, что если есть исключения, я обычно использую что-то вроде Messagebox.Show (ErrorNumber) в catch, поэтому пользователь знает, что произошло. Когда мой экран загрузки включен, и появляется окно сообщения, его невозможно щелкнуть.

Я хотел бы настроить это. Есть ли способ поместить функцию в мой MdiParent (или где-то еще, пока это только один раз), поэтому он запускает код всякий раз, когда отображается MessageBox? Таким образом, я могу легко вызвать функцию закрытия моего экрана загрузки. Есть, вероятно, другие решения, но я хотел бы узнать больше об окнах, крюках и т. Д.

+1

Хотя вы, возможно, захотите узнать больше о ручках и крючках окон и т. Д., Вы также должны рассмотреть хорошую практику кодирования. И я сомневаюсь, что ваш предложенный метод является правильным решением. –

ответ

0

Вы можете подписаться на событие Application.EnterThreadModal.

Это будет повышаться каждый раз, когда ваше приложение собирается войти в модальное состояние (например, потому что оно собирается отображать окно сообщения).

Обратите внимание, что есть также соответствующее событие Application.LeaveThreadModal.

+0

В статье MSDN для EnterThreadModal в примере отображается MessageBox, когда происходит событие. Я думал, что это снова приведет к событию снова, что приведет к бесконечным MessageBoxes, но я просто попробовал его, и он отображался только один раз. Почему это? –

+1

Обновление: я пробовал то же самое с LeaveThreadModal-event. В этом случае это приводит к infite MessageBoxes. Что странно, поскольку Enter-событие «не произошло» - может ли кто-нибудь объяснить? –

1

Я думаю, что это ужасная идея. Имхо, вместо того, чтобы практиковать такое вуду, вы должны исправить реальную проблему, как вы справляетесь с исключениями. Фиксированный код может выглядеть следующим образом:

catch(Exception ex) 
{ 
    CloseLoadingScreen(); 
    MessageBox.Show(ErrorNumber); 
} 

Я имею в виду, вы можете исследовать окна крючки и прочее, его только, что вы выбрали плохой случай.

Редактировать: Я считаю, что правильный способ реорганизации вашего кода - реализовать сущность, единственная цель которой будет уведомлять пользователя о важных вещах. Этот объект будет иметь информацию о загрузке состояния экрана и других соответствующих материалах, и в зависимости от этого контекста будет выполняться набор действий (показать окно сообщения, записать в журнал, закрыть экран загрузки и т. Д.). Затем вы можете использовать эту сущность всякий раз, когда вам нужно отправить уведомление. Таким образом, вам не нужно будет выполнять все инструкции catch, когда вы хотите изменить логику уведомлений. Для облегчения доступа можно сделать одноэлементный.

+0

Да, но это означало бы, что мне придется менять тонны кодов исключений ... Вот почему я ищу решение этой задачи с помощью одной функции. Но вы правы, я не очень хорошо обрабатываю исключения. – rvgiesen

+0

Я согласен с ответом Никиты. Я унаследовал довольно большую Winforms codebase, и мне пришлось сделать что-то подобное - я попытался сделать магию с MDI, но в итоге это вызвало больше проблем, чем решений. В конце концов, я просмотрел все вызовы MessageBox.Show() и CustomForm.ShowDialog() на всей базе кода и обработал проблему «вручную». –

+0

@rvgiesen, ну, ты это сказал. Вы плохо разбираетесь в исключениях. И чем скорее вы исправите эту проблему, тем лучше. Решение, которое вы предложили, не является решением, это обходное решение, которое в конечном итоге будет стоить вам. –

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