检测窗体何时关闭c#



我创建了一个WinForm,它显示一个带有按钮的提示。这是一个自定义的WinForm视图,因为消息框对话框是不够的。

我有一个后台工作人员启动并运行。如果单击了myForm上的按钮,我还想退出while(aBackgroundWorker.IsBusy)循环。

//MyProgram.cs
using(CustomForm myForm = new CustomForm())
{
    myForm.Show(theFormOwner);
    myForm.Refresh();
    while(aBackgroundWorker.IsBusy)
    {
        Thread.Sleep(1);
        Application.DoEvents();
    }
}

现在,在CustomFormButton_clicked事件中,我有

//CustomForm.cs
private void theButton_Click(object sender, EventArgs e)
{
  this.Close();
}

我是否需要向CustomForm类或声明和初始化表单的位置添加更多代码,以便能够检测闭包?

要检测表单何时实际关闭,您需要挂接FormClosed事件:

    this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
    void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        // Do something
    }

或者:

using(CustomForm myForm = new CustomForm())
{
    myForm.FormClosed += new FormClosedEventHandler(MyForm_FormClosed);
    ...
}
void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
    // Do something
}

你可能太夸张了。要像对话框窗口一样显示窗体,并等待它退出,然后将控件返回到调用窗体,只需使用:

mySubForm.ShowDialog();

这将"阻塞"主窗体,直到子窗体关闭为止。

确保您的后台工作人员支持取消,并如其他人所指出的那样使用表单关闭事件处理程序。这个代码应该为你指明正确的方向:

using(CustomForm myForm = new CustomForm())
{
  myForm.FormClosed += new FormClosedEventHandler(ChildFormClosed);
  myForm.Show(theFormOwner);
  myForm.Refresh();

  while(aBackgroundWorker.IsBusy)
  {
    Thread.Sleep(1);
    Application.DoEvents();
  }
}
void ChildFormClosed(object sender, FormClosedEventArgs e)
{
    aBackgroundWorker.CancelAsync();
}

处理表单关闭时要通知的表单的FormClosing事件,以便执行任何清理。

您应该能够挂接FormClosing和FormClosed事件。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosing.aspxhttp://msdn.microsoft.com/en-us/library/system.windows.forms.form.formclosed.aspx

关闭是在它关闭之前。关闭是在它关闭之后。

有几件事。。。

首先,出现循环是为了防止对话框打开时执行表单继续进行。如果是这种情况,请将.Show(parent)更改为.ShowDialog(parent)。这也会解决你剩下的问题。

注意,this.Hide();与实际对话框中的this.Close();不同——覆盖关闭事件

相关内容

  • 没有找到相关文章

最新更新