【问题标题】:Close modal dialog from external thread - C#从外部线程关闭模式对话框 - C#
【发布时间】:2010-11-03 20:09:24
【问题描述】:

我正在努力寻找一种方法来使用 C# 创建我想要的表单功能。

基本上,我想要一个具有指定超时期限的模式对话框。看起来这应该很容易做到,但我似乎无法让它发挥作用。

一旦我调用this.ShowDialog(parent),程序流程就会停止,如果用户不先单击按钮,我将无法关闭对话框。

我尝试使用 BackgroundWorker 类创建一个新线程,但我无法让它关闭另一个线程上的对话框。

我在这里遗漏了什么明显的东西吗?

感谢您提供的任何见解。

【问题讨论】:

    标签: c# winforms user-interface


    【解决方案1】:

    您需要在创建表单的线程上调用 Close 方法:

    theDialogForm.BeginInvoke(new MethodInvoker(Close));
    

    【讨论】:

      【解决方案2】:

      使用System.Windows.Forms.Timer。将其Interval 属性设置为您的超时,并将其Tick 事件处理程序设置为关闭对话框。

      partial class TimedModalForm : Form
      {
          private Timer timer;
      
          public TimedModalForm()
          {
              InitializeComponent();
      
              timer = new Timer();
              timer.Interval = 3000;
              timer.Tick += CloseForm;
              timer.Start();
          }
      
          private void CloseForm(object sender, EventArgs e)
          {
              timer.Stop();
              timer.Dispose();
              this.DialogResult = DialogResult.OK;
          }
      }
      

      计时器在 UI 线程上运行,因此从滴答事件处理程序中关闭表单是安全的。

      【讨论】:

        【解决方案3】:

        如果您真的只是想要一个模态对话框,那么我发现这是迄今为止最好的解决方案:http://www.codeproject.com/KB/miscctrl/CsMsgBoxTimeOut.aspx(请阅读 cmets 部分进行小修改)。

        如果您想以模态方式显示自己的表单,那么 adrianbanks 的解决方案是最好的。

        【讨论】:

          【解决方案4】:

          你可以Invoke从你的后台线程关闭

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-16
            • 2014-06-25
            • 1970-01-01
            相关资源
            最近更新 更多