如何防止对话框窗体关闭后被卸载 解决重复打开加载慢问题
解决方案
- 拦截窗体关闭逻辑,替换默认关闭为隐藏
ShowDialog打开的窗体会在关闭时默认触发Dispose释放资源,隐藏无效的核心原因是未拦截默认的关闭行为,需要在窗体的FormClosing事件中取消默认关闭,改为隐藏:
protected override void OnFormClosing(FormClosingEventArgs e) { // 仅拦截用户主动关闭场景,避免程序退出时无法正常释放资源 if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; this.Hide(); return; } base.OnFormClosing(e); }
如果需要保留DialogResult返回值给调用端判断,修改按钮点击逻辑,不要直接调用Close:
private void btnConfirm_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.OK; this.Hide(); } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.Hide(); }
- 开启列表控件UI虚拟化
3000+条数据不需要全量渲染,开启虚拟化后仅渲染可视区域内的条目,首次加载速度会大幅提升:- WinForms 下
ListBox设置VirtualMode = true,配合VirtualListSize属性实现 - WPF 下
ListBox默认开启虚拟化,确认未手动设置VirtualizingStackPanel.IsVirtualizing="False"即可
- WinForms 下
- 调用端注意事项
调用逻辑无需修改,仅需在程序完全退出前手动释放预创建的对话框实例,避免内存泄漏:
// 全局仅预创建一次实例 var dlg = new frmDlg(); // 每次调用打开,逻辑和之前完全一致 var result = dlg.ShowDialog(this); if(result == DialogResult.OK) { // 处理业务逻辑 } // 程序退出前手动释放资源 dlg.Dispose();
如果每次打开对话框需要重置内部状态(比如清空选中项、重置输入内容),可在窗体中自定义Reset()方法,调用ShowDialog前执行即可。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

