我创建了一个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();
}
}
现在,在CustomForm
和Button_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();
不同——覆盖关闭事件