因此,我需要在我的程序中執行繁重的接口操作...更具體地說,填充一個Windows窗體列表視圖和動態生成圖像。這不能在另一個線程上完成。
那麼如何通過我的主要WPF窗口顯示模式,工作(響應)對話框?
該對話框可以是WPF或winforms,我不在乎,我會適應...在C#中進行接口操作時顯示等待對話框
它必須是可用的,並始終保持以上,並在形式上阻止它的所有者形式。
因此,我需要在我的程序中執行繁重的接口操作...更具體地說,填充一個Windows窗體列表視圖和動態生成圖像。這不能在另一個線程上完成。
那麼如何通過我的主要WPF窗口顯示模式,工作(響應)對話框?
該對話框可以是WPF或winforms,我不在乎,我會適應...在C#中進行接口操作時顯示等待對話框
它必須是可用的,並始終保持以上,並在形式上阻止它的所有者形式。
只需實現一個對話框,並在耗時函數中使用.ShowDialog()來調用它。無論何時你有耗時的循環,每隔一段時間調用一次Application.DoEvents()以允許對話框顯示和更新。雖然...
要小心,因爲如果,例如,如果您正在處理Paint事件,然後調用Application.DoEvents(),您可能會輸入Paint事件處理程序兩次,這是不可取的。
在WPF窗口或WinForm上放置圖像並插入:http://www.hindustantimes.com/images/loading_gif.gif將自動獲取動畫。使用.ShowDialog(OwnerWindow)
顯示窗口,因此它將始終保持在它的所有者窗口之上。
但界面仍然是不可交互的,所以這是不夠的... BTW真棒圖像! – Vercas 2011-04-19 09:45:33
如果你可以調用Application.DoEvents並且它工作正常,那麼這肯定是一種方法。但是,根據我的經驗,Application.DoEvents通常是一種破解,而且很少是一個好主意。
我首先想到的是,也許你可以創建一個後臺線程來生成你的圖像。開始你的線程並顯示你的模態對話框。對於你的線程,在創建了一定數量(例如5,10,20,50,無論)之後,它會調用事件分派器並執行一個方法,使用新批次的圖像更新ListView。因爲它只是週期性的調用,所以會給Modal Dialog時間來處理它自己的消息。您在事件調度程序上調用的函數將收到圖像列表,調用ListView.BeginUpdate(),遍歷列表並創建和添加項目,然後調用ListView.EndUpdate()
還有其他方法可以執行這個,但我真的會嘗試避免Application.DoEvents()(根據我的經驗,這是來自不懂線程的Visual Basic程序員的黑客)。
你甚至可以添加一個秒錶到你的後臺線程,讓它每隔幾秒更新列表而不是計數圖像。在每張圖片上更新你的gui似乎是一個糟糕的主意(很多gui更新)。 – Alan 2012-10-15 09:42:25
你認爲你不能在另一個線程上做什麼操作? – 2011-04-17 17:07:17
@ 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
它可以在其他線程完成。當然,UI的更新不能。但其中一個不是另一個。 – Will 2011-04-17 17:14:35