我正在开发一个控制台应用程序,该应用程序创建一个表单来提醒用户某些给定的状态-在稍后的阶段,代码库将成为一个类库。
现在,然而,我需要显示表单(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);
Close
,你可以告诉你的控制台线程继续。