c# - Form.ShowDialog() 不破坏句柄

标签 c# .net winforms modal-dialog

我正在尝试使用 Form.ShowDialog 显示表单,如下所示:

var f = new Form();
if(f.ShowDialog() == DialogResult.OK)
{
     ...
}
...
if(f.ShowDialog() == DialogResult.OK)
{
     ...
}

问题是,一旦返回对话框结果并关闭表单,就会调用 OnHandleDestroyed。

  • 为什么我关心 OnHandleDestroyed?我在窗体上有一个 OpenGL 控件,它会在调用 OnHandleDestroyed 时处理 Context。
  • 为什么我不处理该表单,并在新表单上使用 ShowDialog?我正在尝试重用该表单,因为加载表单很慢 - 但用数据填充它很快。

所以问题是:是否可以在不关闭表单(并隐藏它)的情况下使用 ShowDialog() 或使用 Show() 和 Hide() 以模态方式显示表单?

最佳答案

当您使用 ShowDialog 显示表单时,关闭表单后 DestroyHandle将被自动调用。

要防止这种行为,您可以重写 DestroyHandle 方法并编写自己的逻辑。

示例

public class MyForm : Form
{
    protected override void DestroyHandle()
    {
        if (!Modal || Disposing)
            base.DestroyHandle();
    }
}

关于c# - Form.ShowDialog() 不破坏句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46769725/

相关文章:

c# - WPF 始终关注文本框

c# - 在 Switch 语句中使用 .StartsWith?

c# - 当我不知道类型时,我可以获取属性的 DataAnnotation 显示名称吗?

c# - 在开头获取多个字符串的相等部分

.net - .net哈希表插入失败。负载系数太高

c# - 有没有类似 Android RecyclerView for C# Winforms 的东西

c# - 无法抑制 WinForms 应用程序中的键

c# - WinForm 弹出窗体与父级的关系

c# - SSH.NET 中的 MySQL 端口转发 - 尝试以访问权限禁止的方式访问套接字

c# - 是否有内置方法将 HRESULT 表示为 winerror.h 常量(例如 E_FAIL)?