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

时间:2013-03-06 16:42:57

标签: c# .net winforms

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

但是现在,我需要显示表单(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线程,但是想知道是否有人对此有任何建议,或者之前遇到过这个。

3 个答案:

答案 0 :(得分:5)

如果您想要显示表单,然后继续工作,然后关闭它 - 您可以通过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 /通知。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

运行自己的表单

Application.Run(YourForm);

例如,您需要使用互斥锁保持控制台线程,以防止表单处于打开状态。 该表单提供了您从WinForms中了解的所有方法,例如Close,您可以在其中告诉控制台线程继续。

请参阅MSDN上的this