簡體   English   中英

C#WinForms ShowDialog()調用任意方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM