【问题标题】:C# WinForms ShowDialog() call arbitrary methodC# WinForms ShowDialog() 调用任意方法
【发布时间】:2013-03-06 16:42:56
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

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

    【讨论】:

    • “但是,如果这纯粹是一个控制台应用程序(并且没有消息泵),那么它可能无法正常工作。”我同意你的看法,目前,我使用表格作为一种方式来直观地展示最终版本中引发的事件(将代替表格)将是什么样子。相反,我可能会直接添加事件,然后在其他地方捕获它们。
    【解决方案2】:

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

    【讨论】:

    • 我同意,请参阅我对 Reed Copsey 回答的初步评论
    【解决方案3】:

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

    来运行自己的表单

    Application.Run(YourForm);

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

    请参阅 MSDN 上的 this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2022-10-01
      相关资源
      最近更新 更多