【问题标题】:Form.ShowDialog() Without Destroying HandleForm.ShowDialog() 不破坏句柄
【发布时间】:2017-10-16 11:54:28
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您可以编写自己的逻辑来隐藏输入的表单
  • 但是如何保持它的模态?
  • @Sinatr,它不是那个重复的,因为我特别希望表单是模态的。
  • 那么不要关闭它。你必须选择:要么每次都重新创建opengl的东西,要么..不要关闭表单。有一些方法可以使无模式形式成为模态,例如here.

标签: c# .net winforms modal-dialog


【解决方案1】:

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

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

示例

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

【讨论】:

  • 另外,当您不再需要模态对话框时,不要忘记处理它们。欲了解更多信息,请查看this post
  • 伟大的 Reza!解决了我的确切问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
相关资源
最近更新 更多