2013-03-06 64 views
4

我正在创建一个控制台应用程序,该应用程序创建一个表单以提醒某些给定状态的用户 - 稍后,代码库将成为一个类库。然而,现在,我需要显示窗体(ShowDialog将是这里最好的方法,我猜)然后在窗体关闭之前调用任意方法。作为一个例子,我需要显示表单,设置标签控件的文本值,等待n秒,然后更改标签的值,然后关闭表单。我知道这听起来有些微不足道,但我试图对设计进行概念验证。C#WinForms ShowDialog()调用任意方法

我看了一下,看起来好像这是不可能的,因为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线程,但想知道是否有人对此有任何建议,或者之前遇到过这个问题。

回答

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 /通知可能会更好。

+0

的初步评论。“但是,如果这纯粹是一个控制台应用程序(并且没有消息泵),那么这可能无法正常工作。”目前,我同意你的看法,我使用表单作为一种方式,以直观的方式显示最终版本中提出的事件(将代替表单)的样子。取而代之,我可能只是开展一些活动,并在其他地方抓住他们。 – 2013-03-07 08:46:04

3

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

+0

我同意,请参阅我对Reed Copsey的回答 – 2013-03-07 08:46:37

2

ShowDialog -method创建一个“模式”窗口,并且通常会阻止用户界面直到您关闭它(通过单击“确定”或“取消”)。您需要自己创建一个WinForm,但可以是一个简单的WinForm,并为它创建一个消息泵。你可以通过调用

Application.Run(YourForm);

您将需要与例如互斥保持您的控制台线程,以防止它继续经营自己的形式,而形式是开放的。 表单提供了您从WinForms所知的所有方法,如Close,您可以在其中指示您的控制台线程继续。

请参阅MSDN上的this