2011-08-22 45 views
2

我有一個強大的命名組件。ShowDialog無阻塞來電

這個問題之前已經被問過......但只是有點不同而且目的不同。

我有一個Form基類。當實現類在基類IsBusy上設置屬性時。我想阻止與表單的所有交互(設置Enabled = false是不夠的 - 我也想阻止移動,調整大小,關閉等......並且我不希望我的控件在IsBusy == true時看起來被禁用),並顯示前面的彈出式加載表單(帶有加載動畫的透明無邊框形式)。

在我的加載動畫表單上調用ShowDialog在阻止調用窗體上的交互方面做了竅門......但顯然我還希望調用表單代碼繼續執行。

現在我正在使用新的LoadingForm().show(),然後在我的調用窗體上處理WndProc,並且如果IsBusy == true我禁止所有WndProc消息......但我不喜歡這種方法。它可以防止表單重新繪製,我不想要。

如果我知道所有不同類型的消息讓我們通過允許正確的重新繪製,我不會介意WndProc的方法,但我不知道。

所以,我的問題是:

有沒有更好的解決方案?

罐有人告訴什麼WndProc的消息我應該讓過?或者在哪裏可以找到詞彙表?

謝謝。

+0

「顯然我還希望調用窗體線程繼續執行」 - 只是不做任何事情,它會。看起來你正在解決一個不存在的問題。 –

+1

執行此操作的一種方法是啓動一個新的線程以運行該操作(而不是原始的UI線程),並且完成該線程關閉「忙碌」對話框(通過調用),以便消息泵將控制恢復爲原始形成。一個標準的封裝是使用BackgroundWorker。 –

+0

你是對的,使用BackgroundWorder可以消除這個問題。但我想集中進行這種更改......並且我知道有些地方不使用BackgroundWorker,這會在這種更改後使這些地方無法正常工作。 – Jeff

回答

12

我結束了BeginInvoke'ing一個ShowDialog的:

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

有讓代碼後,該行繼續運行,仍要堵塞與myForm的所有交互的預期效果。

+0

我想這就是大家都想告訴你的...... –

+1

我不這麼認爲。沒有人將此作爲潛在的解決方案。差遠了。 – Jeff

+1

溝通總是最難的部分... –

3

如果您想通過繪畫,請允許WM_PAINTWM_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