我有一个具有多个 MDI 子窗口的 winforms C# 应用程序,每个子窗口都可以包含更改的用户数据。
单独关闭子窗口时,将警告用户有关更改的数据,这工作正常。
但是,如果用户尝试关闭应用程序,我只想对所有子窗口发出一次警告,如果有数据已更改(数据不是那么重要)。
因此,我们的想法是挂钩到主窗口的 OnClosing 事件,在任何子窗口中查找更改的用户数据,如果我发现任何更改的数据,则只显示一次警告,并设置一个布尔值以防止每个子窗口多次打扰用户。
我看到的问题是,主窗口的 OnClosed 事件是在触发每个子窗口的 OnClosing 事件后触发的,所以我无法足够快地设置我的布尔值。
是否有我可以挂接到的应用程序关闭事件比 OnClosing 更早到达,或者是否有我可以捕获的 Windows 消息?
如果 FormClosesingEventArgs.CloseReason MdiFormClosing
,您可以让子表单订阅 FormClosing 事件并跳过处理,而不是挂接到 MDI 父窗体关闭消息和设置标志:
private void ChildForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.MdiFormClosing) return; // Do nothing
// ...
}
解决了,我只需要挂接到WM_CLOSE Windows消息:
protected override void WndProc(ref Message m)
{
// Crucially, this message arrives before my child windows get the OnClosing event.
if (m.Msg == WM_CLOSE)
{
// So I set my boolean here and everything works great.
}
base.WndProc(ref m);
}
我会在每个子窗口中创建一个布尔值,指示是否打开提示。
public bool Prompt = true;
private void Form_Closing(object sender, EventArgs e)
{
if (Prompt)
{
MessageBox.Show("Data thingy...whatever");
}
}
然后在您的主窗体中,您可以将此布尔值设置为 false。
private void MainForm_Closing(object sender, EventArgs e)
{
form1.Prompt = false;
form1.Close();
form2.Prompt = false;
form2.Close();
//etc
}