Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WinForms ShowDialog()调用任意方法_C#_.net_Winforms - Fatal编程技术网

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

C#WinForms ShowDialog()调用任意方法,c#,.net,winforms,C#,.net,Winforms,我正在开发一个控制台应用程序,它创建一个表单来提醒用户某些给定的状态——在稍后的阶段,代码库将成为一个类库 但是现在,我需要显示表单(我想ShowDialog是这里最好的方法),然后在表单关闭之前调用任意方法 例如,我需要显示表单,设置label控件的文本值,等待n秒,然后更改标签的值,然后关闭表单。我知道这听起来有点琐碎,但我试图证明设计的概念 我环顾了一下,看起来这是不可能的,因为ShowDialog()要求我先关闭表单,然后才能继续查看调用方法/类中的代码列表 以下是我目前掌握的情况: P

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

但是现在,我需要显示表单(我想ShowDialog是这里最好的方法),然后在表单关闭之前调用任意方法

例如,我需要显示表单,设置label控件的文本值,等待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线程,但我想知道是否有人对此有任何建议,或者以前遇到过这种情况。

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

如果要显示表单,请继续工作,然后关闭它-您可以通过
form.show()
而不是
form.ShowDialog()


但是,如果这纯粹是一个控制台应用程序(并且没有消息泵),那么它可能无法正常工作

其他选项是在
表单中提供一个计时器使其关闭,或者将一个委托传递到表单中以在显示时运行您的方法,然后它可以自行关闭

在以后的阶段,代码库将成为类库


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

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

Application.Run(YourForm)

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


请参见MSDN上的。

“但是,如果这纯粹是一个控制台应用程序(并且没有消息泵),那么这可能无法正常工作。”我同意您的看法,目前,我使用表单作为一种方式,直观地显示最终版本中引发的事件(将代替表单)的外观。我可能只是把事件放进去,然后在其他地方捕捉它们。我同意,请看我对里德·科佩答案的初步评论
using (var myForm = new PopUpForm(messageToDisplay))
{
    myForm.Show(); // Show the form

    DoWork(); // Do your work...

    myForm.Close(); // Close it when you're done...
}