You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止对话框窗体关闭后被卸载 解决重复打开加载慢问题

解决方案
  • 拦截窗体关闭逻辑,替换默认关闭为隐藏
    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"即可
  • 调用端注意事项
    调用逻辑无需修改,仅需在程序完全退出前手动释放预创建的对话框实例,避免内存泄漏:
// 全局仅预创建一次实例
var dlg = new frmDlg();

// 每次调用打开,逻辑和之前完全一致
var result = dlg.ShowDialog(this);
if(result == DialogResult.OK)
{
    // 处理业务逻辑
}

// 程序退出前手动释放资源
dlg.Dispose();

如果每次打开对话框需要重置内部状态(比如清空选中项、重置输入内容),可在窗体中自定义Reset()方法,调用ShowDialog前执行即可。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:24:01