У меня есть сильная именованная сборка.ShowDialog без блокировки вызывающего абонента
Это было задано раньше ... но только для разных целей.
У меня есть базовый класс формы. Когда класс реализации устанавливает свойство в базовом классе IsBusy
. Я хочу заблокировать все взаимодействие с Формой (установка Enabled = false не достаточна - я также хочу заблокировать перемещение, изменение размера, закрытие и т. Д.), И я не хочу, чтобы мои элементы управления выглядели отключенными, когда IsBusy == true
) и показывают передняя форма загрузки (прозрачная, без полей форма с анимацией загрузки).
Вызов ShowDialog в моей форме анимации загрузки делает трюк с точки зрения блокировки взаимодействия в вызывающей форме ... но, очевидно, я также хочу, чтобы код вызывающих форм продолжал выполняться.
Сейчас я использую новый метод LoadingForm(). Показываю(), а затем обрабатываю WndProc в моей вызывающей форме, и если IsBusy == true
я подавляю все сообщения WndProc ... но мне не нравится этот подход. Он также предотвращает перерисовку формы, чего я не хочу.
Я бы не против подхода WndProc так много, если бы знал все разные типы сообщений, чтобы разрешить правильную перерисовку, пока IsBusy == true
... но я этого не делаю.
Итак, мой вопрос:
Есть ли лучшее решение?
или
Стаканчиков кто подскажет какой WNDPROC сообщение я должен пропускать? Или где найти глоссарий?
Спасибо.
«Очевидно, я также хочу, чтобы поток вызывающих форм продолжал выполняться» - просто ничего не делайте, и это будет. Похоже, вы решаете проблему, которой нет. –
Один из способов сделать это - начать новый поток для запуска операции (а не из исходного потока пользовательского интерфейса) и завершить завершение этого потока закрытием диалогового окна «занято» (через Invoke), чтобы насос сообщения возвращал управление оригиналу форма. Одно стандартное инкапсулирование этого - использование BackgroundWorker. –
Вы правы, используя BackgroundWorder устранит проблему. Но я хочу сделать это изменение централизованно ... и я знаю, что в некоторых местах не используется BackgroundWorker, из-за чего эти места не будут функционировать после этого изменения. – Jeff