2011-08-22 4 views
2

У меня есть сильная именованная сборка.ShowDialog без блокировки вызывающего абонента

Это было задано раньше ... но только для разных целей.

У меня есть базовый класс формы. Когда класс реализации устанавливает свойство в базовом классе IsBusy. Я хочу заблокировать все взаимодействие с Формой (установка Enabled = false не достаточна - я также хочу заблокировать перемещение, изменение размера, закрытие и т. Д.), И я не хочу, чтобы мои элементы управления выглядели отключенными, когда IsBusy == true) и показывают передняя форма загрузки (прозрачная, без полей форма с анимацией загрузки).

Вызов ShowDialog в моей форме анимации загрузки делает трюк с точки зрения блокировки взаимодействия в вызывающей форме ... но, очевидно, я также хочу, чтобы код вызывающих форм продолжал выполняться.

Сейчас я использую новый метод LoadingForm(). Показываю(), а затем обрабатываю WndProc в моей вызывающей форме, и если IsBusy == true я подавляю все сообщения WndProc ... но мне не нравится этот подход. Он также предотвращает перерисовку формы, чего я не хочу.

Я бы не против подхода WndProc так много, если бы знал все разные типы сообщений, чтобы разрешить правильную перерисовку, пока IsBusy == true ... но я этого не делаю.

Итак, мой вопрос:

Есть ли лучшее решение?

или

Стаканчиков кто подскажет какой WNDPROC сообщение я должен пропускать? Или где найти глоссарий?

Спасибо.

+0

«Очевидно, я также хочу, чтобы поток вызывающих форм продолжал выполняться» - просто ничего не делайте, и это будет. Похоже, вы решаете проблему, которой нет. –

+1

Один из способов сделать это - начать новый поток для запуска операции (а не из исходного потока пользовательского интерфейса) и завершить завершение этого потока закрытием диалогового окна «занято» (через Invoke), чтобы насос сообщения возвращал управление оригиналу форма. Одно стандартное инкапсулирование этого - использование BackgroundWorker. –

+0

Вы правы, используя BackgroundWorder устранит проблему. Но я хочу сделать это изменение централизованно ... и я знаю, что в некоторых местах не используется BackgroundWorker, из-за чего эти места не будут функционировать после этого изменения. – Jeff

ответ

12

Я кончался BeginInvoke'ing в ShowDialog:

myForm.BeginInvoke(new Action(() => new LoadingForm().ShowDialog())); 

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

+0

Я думаю, что это все пытались вам рассказать ... –

+1

Я так не думаю. Никто не дал это как потенциальное решение. Даже не близко. – Jeff

+1

Связь всегда самая сложная часть ... –

3

Если вы хотите пропустить картину, позвоните WM_PAINT и WM_NCPAINT.

+0

Есть ли статический класс со всеми указанными значениями сообщения или что-то еще? Или есть хороший глоссарий с предоставленными значениями int? – Jeff

+1

pinvoke.net может удовлетворить все ваши потребности в pinvoking: http://pinvoke.net/default.aspx/Enums/WindowsMessages.html – Blindy

2

Вы делаете это слишком сложным. Все, что вам нужно сделать, это не закрывать диалог. Внесите событие FormClosing (или переопределите OnFormClosing, лучше) и установите e.Cancel = true, когда операция занята. Тогда пользователь ничего не может сделать, чтобы нарушить ваш процесс.

Это все предполагается, что вы использовали рабочий поток для реализации операции.

+0

Я не думаю, что вы правильно поняли проблему. Я не хочу полагаться на каждую наследующую форму, чтобы иметь возможность безопасно установить IsBusy = true из фонового потока. Это не просто закрытие, которое я хочу предотвратить, это все взаимодействие. – Jeff

+1

В этом случае вам нужно привести пример взаимодействия. Я ничего не могу придумать. –

+0

Итак, так как окно загрузки действует как диалог, если я вызываю ShowDialog на нем, правильно? Если я это сделаю, он блокирует вызывающий поток. Итак, парень, который устанавливает myForm.IsBusy = true, будет висеть на этой линии и никогда не сможет вернуть IsBusy в false ... так что форма загрузки останется навсегда. Я что-то не понимаю? – Jeff

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