2011-04-17 42 views
0

因此,我需要在我的程序中執行繁重的接口操作...更具體地說,填充一個Windows窗體列表視圖和動態生成圖像。這不能在另一個線程上完成。
那麼如何通過我的主要WPF窗口顯示模式,工作(響應)對話框?
該對話框可以是WPF或winforms,我不在乎,我會適應.​​..在C#中進行接口操作時顯示等待對話框

它必須是可用的,並始終保持以上,並在形式上阻止它的所有者形式。

+0

你認爲你不能在另一個線程上做什麼操作? – 2011-04-17 17:07:17

+0

@ jdv-Jan de Vaan:當你更新一個控件時,除非你遵循一個我記不清的特定過程,否則你必須從所有者的同一個線程來完成它,但要做到這一點並不難。這是另一個問題的參考:http://stackoverflow.com/questions/1136399/how-to-update-textbox-on-gui-from-another-thread-in-c – 2011-04-17 17:10:54

+0

它可以在其他線程完成。當然,UI的更新不能。但其中一個不是另一個。 – Will 2011-04-17 17:14:35

回答

2

只需實現一個對話框,並在耗時函數中使用.ShowDialog()來調用它。無論何時你有耗時的循環,每隔一段時間調用一次Application.DoEvents()以允許對話框顯示和更新。雖然...

要小心,因爲如果,例如,如果您正在處理Paint事件,然後調用Application.DoEvents(),您可能會輸入Paint事件處理程序兩次,這是不可取的。

+0

我到底怎麼沒有想到這個?謝謝! – Vercas 2011-04-17 20:08:26

+0

等一下。該對話框以這種方式阻止該功能... – Vercas 2011-04-17 20:18:44

+0

@Vercas:你是什麼意思它阻止了該功能?該函數應該完成執行... – 2011-04-17 22:13:43

1

在WPF窗口或WinForm上放置圖像並插入:http://www.hindustantimes.com/images/loading_gif.gif將自動獲取動畫。使用.ShowDialog(OwnerWindow)顯示窗口,因此它將始終保持在它的所有者窗口之上。

+0

但界面仍然是不可交互的,所以這是不夠的... BTW真棒圖像! – Vercas 2011-04-19 09:45:33

0

如果你可以調用Application.DoEvents並且它工作正常,那麼這肯定是一種方法。但是,根據我的經驗,Application.DoEvents通常是一種破解,而且很少是一個好主意。

我首先想到的是,也許你可以創建一個後臺線程來生成你的圖像。開始你的線程並顯示你的模態對話框。對於你的線程,在創建了一定數量(例如5,10,20,50,無論)之後,它會調用事件分派器並執行一個方法,使用新批次的圖像更新ListView。因爲它只是週期性的調用,所以會給Modal Dialog時間來處理它自己的消息。您在事件調度程序上調用的函數將收到圖像列表,調用ListView.BeginUpdate(),遍歷列表並創建和添加項目,然後調用ListView.EndUpdate()

還有其他方法可以執行這個,但我真的會嘗試避免Application.DoEvents()(根據我的經驗,這是來自不懂線程的Visual Basic程序員的黑客)。

+0

你甚至可以添加一個秒錶到你的後臺線程,讓它每隔幾秒更新列表而不是計數圖像。在每張圖片上更新你的gui似乎是一個糟糕的主意(很多gui更新)。 – Alan 2012-10-15 09:42:25

相關問題