c# WinForms中的ShowDialog()调用任意方法



我正在开发一个控制台应用程序,该应用程序创建一个表单来提醒用户某些给定的状态-在稍后的阶段,代码库将成为一个类库。

现在,然而,我需要显示表单(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中提供一个定时器来关闭它,或者传递一个委托到Form来运行你的Show方法,之后它可以关闭自己。

在后面的阶段,代码库将变成一个类库。

当你这样做的时候,你可能想要想出一个不同的机制来提供通知。将库与特定的UI技术耦合是一个坏主意。最好让你的库只提供事件或其他通知,并允许用户向用户提供UI/通知。

如果这段代码注定要在代码库中结束,我建议不要让它显示任何形式,无论如何,它自己的意志。库应该生成事件,或者在某些情况下可以由调用应用程序捕获的异常,以允许它显示表单。如果需要向用户展示的某些细节是库内部的,则从库中公开DisplayEventData()方法。

ShowDialog -方法创建一个"模态"窗口,并且通常阻塞UI,直到您关闭它(通过单击确定或取消)。你需要自己创建一个WinForm,可以是一个简单的,并为它创建一个消息泵。您可以通过调用

来运行自己的表单

Application.Run(YourForm);

例如,当窗体打开时,您需要使用互斥锁来保持控制台线程,以防止它继续。这个表单提供了所有你从WinForms中知道的方法,比如Close,你可以告诉你的控制台线程继续。

最新更新