[英]C# WinForms ShowDialog() call arbitrary method
我正在開發一個控制台應用程序,它創建一個表單來提醒某些給定狀態的用戶 - 在稍后階段,代碼庫將成為一個類庫。
但是,現在,我需要顯示表單(ShowDialog將是這里最好的方法,我猜)然后在表單關閉之前調用任意方法。
作為一個例子,我需要顯示表單,設置標簽控件的文本值,等待n秒,然后更改標簽的值,然后關閉表單。 我知道這聽起來有點微不足道,但我正在嘗試對設計進行概念驗證。
我已經瀏覽了一下它看起來不可能,因為ShowDialog()要求我在調用方法/類之前繼續通過代碼列表之前關閉表單。
這是我到目前為止所擁有的:
PopUpForm myForm = new PopUpForm(string messageToDisplay);
myForm.ShowDialog();
//call myForm.someMethod() here, before the form closes
//dispose of the form, now that we've no use for it
myform.Dispose();
//target method in PopUpform class
public void someMethod()
{
lblText.Text = "Waiting for some reason";
//wait n number of seconds
lblText.Text = "Finished waiting. Form will now close";
//it doesn't matter if the form closes before the user can see this.
}
看起來ShowDialog()不支持這種行為。 我正在研究BackgroundWorker線程,但是想知道是否有人對此有任何建議,或者之前遇到過這個問題。
如果要顯示表單,然后繼續工作,然后關閉它 - 您可以通過Form.Show()
而不是Form.ShowDialog()
:
using (var myForm = new PopUpForm(messageToDisplay))
{
myForm.Show(); // Show the form
DoWork(); // Do your work...
myForm.Close(); // Close it when you're done...
}
但是,如果這純粹是一個控制台應用程序(並且沒有消息泵),那么這可能無法正常工作。
其他選項是在Form
提供一個計時器以使其關閉,或者將委托傳遞給表單以在Show上運行您的方法,之后它可以自行關閉。
在稍后階段,代碼庫將成為類庫。
執行此操作時,您可能希望提供不同的機制來提供通知。 將您的庫與特定的UI技術相結合是一個壞主意。 讓您的庫只提供事件或其他通知可能會更好,並允許用戶向用戶提供UI /通知。
如果這個代碼,即命令最終在代碼庫中,我建議不要讓它顯示任何形式,永遠,它自己的意志。 庫應該生成事件,或者在某些情況下,異常,可以由調用應用程序捕獲以允許它顯示表單。 如果需要向用戶呈現的某些細節是庫的內部細節,則從庫中公開DisplayEventData()方法。
ShowDialog
-method創建一個“模態”窗口,通常會阻止UI,直到您關閉它(通過單擊“確定”或“取消”)。 您需要自己創建一個WinForm,雖然可以是一個簡單的WinForm並為它創建一個消息泵。 您可以通過致電運行自己的表格
Application.Run(YourForm);
例如,您需要使用互斥鎖保持控制台線程,以防止表單處於打開狀態。 該表單提供了您從WinForms知道的所有方法,如Close
,您可以告訴控制台線程繼續。
在MSDN上看到這一點 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.