我試圖在Windows窗體應用程序中實現「分步指南」功能。這些指南只是對如何執行常見任務的逐步說明。我打算讓用戶在閱讀指南時閱讀說明。因此,在顯示模式對話框時,顯示它們的窗口必須爲。如何創建獨立於模式窗口(.NET Windows窗體)的彈出窗口
這可能嗎?如果是這樣,我該怎麼做?
我試圖在Windows窗體應用程序中實現「分步指南」功能。這些指南只是對如何執行常見任務的逐步說明。我打算讓用戶在閱讀指南時閱讀說明。因此,在顯示模式對話框時,顯示它們的窗口必須爲。如何創建獨立於模式窗口(.NET Windows窗體)的彈出窗口
這可能嗎?如果是這樣,我該怎麼做?
感謝andLabs,Tim和IInspectable給我提供解決問題所需的信息。以下是我所需要的:
Thread myFormThread = new Thread(delegate()
{
Application.Run(new MyForm());
});
myFormThread.SetApartmentState(ApartmentState.STA);
myFormThread.Start();
它工作正常。顯然,如果需要通過主窗體的事件處理程序訪問myForm上的控件,則需要小心使用myForm.BeginInvoke。您還需要幫助用戶管理對錶單的訪問,因爲它可能會丟失在其他窗口之後。
當顯示一個模態時,不能與同一UI線程中的任何其他窗口交互。有可能(但可能不是世界上最好的想法)在C#中的同一個進程中運行兩個不同的UI線程 - 但您必須非常小心才能保持穩定。在主線程中,運行常規模態窗體。在輔助線程中,可以同時運行非模態窗體 - 只需在該線程中運行一個專用的Windows消息泵,直到完成UI,然後關閉消息泵並退出線程。
Modality通過禁用所有者窗口來實現。線程可以有任意數量的窗口,只有一個窗口被禁用,擁有模態對話框。系統中沒有任何內容,它禁用了線程上的所有窗口。此外,只要不安裝任何跨線程窗口層次結構(擁有者/擁有者或子/父),擁有多個UI線程並不具有挑戰性。 – IInspectable
你的意思是像工具提示指向各自的控制?是的,這是可能的;只需創建相關窗口所擁有的窗口即可。一個UI模式對話框只是一個對話框,它禁用了它的所有者,而一個代碼模式對話框只是運行它自己的消息泵;請閱讀Raymond Chen的關於對話的系列文章以獲取更多信息。 – andlabs