winforms userControl中的HandleDestroyed事件

l3zydbqr  于 2023-01-02  发布在  其他
关注(0)|答案(2)|浏览(174)

我有一个非常简单的自定义UserControl,名为MyControl
在我的表单中,我有以下代码(我尝试将其放入LoadEvent和构造函数中,在InitalizeCompoment之后):

var crl = new MyControl();
Controls.Add(ctrl);
ctrl.HandleDestroyed+=(sender,evt) => { MessageBox.Show("Destroyed") };

但是当我关闭表单处理程序时,它就不会被调用。

im9ewurl

im9ewurl1#

如果它在主窗体上,那么我认为该事件不会被调用。尝试在FormClosing事件中释放该控件以强制调用该事件:

void Form1_FormClosing(object sender, FormClosingEventArgs e) {
  crl.Dispose();
}

另一种方法是将FormClosing事件添加到UserControl

void UserControl1_Load(object sender, EventArgs e) {
  this.ParentForm.FormClosing += new FormClosingEventHandler(ParentForm_FormClosing);
}

void ParentForm_FormClosing(object sender, FormClosingEventArgs e) {
  OnHandleDestroyed(new EventArgs());
}

或在Lambda方法中:

void UserControl1_Load(object sender, EventArgs e) {
  this.ParentForm.FormClosing += (s, evt) => { OnHandleDestroyed(new EventArgs()); };
}
8iwquhpp

8iwquhpp2#

如果正在关闭的窗体不是主窗体,则调用HandleDestroyed事件。如果主窗体已关闭,则应用程序将中止,并且不再激发事件。
我做了一个测试,启动应用程序如下:

Form1 frmMain = new Form1();
frmMain.Show();
Application.Run();

现在,关闭主窗体并不会取消应用程序。在窗体中,我执行以下操作:

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    new Thread(() =>
    {
        Thread.Sleep(5000); // Give enough time to see the message boxes.
        Application.Exit();
    }).Start();
}

现在,在控件上调用HandleDestroyed和Disposed事件。

public Form1()
{
    InitializeComponent();
    button4.HandleDestroyed += new EventHandler(button4_HandleDestroyed);
    button4.Disposed += new EventHandler(button4_Disposed);
}

void button4_Disposed(object sender, EventArgs e)
{
    MessageBox.Show("Disposed");
}

void button4_HandleDestroyed(object sender, EventArgs e)
{
    MessageBox.Show("HandleDestroyed");
}

相关问题