4

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

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

4

3 回答 3

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/通知。

于 2013-03-06T16:48:24.640 回答
3

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

于 2013-03-06T16:48:18.530 回答
2

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

Application.Run(YourForm);

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

在 MSDN 上看到这个。

于 2013-03-06T16:48:56.570 回答