Этот пост был мне полезен, хотя мой случай немного отличался.
В этом случае избегание _currentForm.Hide();
работает нормально, потому что код выполняет переключение форм.
Я обнаружил, что проблема также связана с MDIChild, который был скрыт другим MDIChild, находящимся сверху.
Вот обходной путь, который также работает в этом случае, основываясь на том факте, что Dispose
всегда вызывается.
Это можно сделать, подготовив что-то вроде этого:
public abstract class FormExtenderClass : Form{
private bool formClosingFired = false;
private bool formClosedFired = false;
protected override void OnFormClosing(FormClosingEventArgs e) {
base.OnFormClosing(e);
formClosingFired = !e.Cancel;
}
protected override void OnFormClosed(FormClosedEventArgs e) {
base.OnFormClosed(e);
formClosingFired = true;
}
protected override void Dispose(bool disposing) {
if (!formClosingFired) OnFormClosing(new FormClosingEventArgs(CloseReason.UserClosing, false));
if (!formClosedFired) OnFormClosed(new FormClosedEventArgs(CloseReason.UserClosing));
base.Dispose(disposing);
}
}
Тогда в коде MDIChildren просто измените первую строку с
public partial class AutoForm : Form {
до
public partial class AutoForm : FormExtenderClass {
Считайте, что в любом случае это может быть недоразумением. Основное отличие состоит в том, что набор e.Cancel=true
не будет действовать в случае, если FormClosing
вызывается из Disposed в качестве резервной копии.