当隐藏模态表单时,应用程序关闭

本文关键字:应用程序 隐藏 模态 表单 | 更新日期: 2023-09-27 18:12:14

我最近创建了一个简单的自定义消息框。它只是另一个叫做using ShowDialog()的表单。

我有两个按钮YES/NO,设置对话sult值,然后使用this.Hide()隐藏表单。

但是,当我这样做时,整个应用程序将关闭。使用This . close()时不会发生这种情况。我选择使用Hide的原因是因为响应似乎更快。当使用关闭时,消息框窗体在关闭前会停留2-3秒。

下面是一些代码:
    public static void Init()
    {
        if (_instance == null)
        {
            _instance = new MQMessageBox();
            _instance.MQButtonYes.Click += MQButtonYes_Click;
            _instance.MQButtonNo.Click  += MQButtonNo_Click;
        }
    }
    public static DialogResult Show(string caption, string message)
    {
        Init();
        _instance.Caption = caption;
        _instance.Message = message;
        DialogResult result = _instance.ShowDialog();
        return result;
    }
    private void MQButtonYes_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.Yes;
        this.Hide();
    }
    private void MQButtonNo_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.No;
        this.Hide();
    }

从主要形式来看,它被称为:

    MQMessageBox.Show("Warning", "Hello World");
    this.Show(); //Adding this call, will show the main form again. Without this call, the mobile will show the Today Screen making it appear the app has crashed.

主要方法是:

        MQMainForm mainForm = new MQMainForm();
        Application.Run(mainForm);

当隐藏模态表单时,应用程序关闭

我知道这不是您想听到的,但是调用以下代码实际上是无效的:

private void MQButtonNo_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.No;
    this.Hide();
}

这样做的原因是设置DialogResult与调用Form.Close()不同。我在Reflector中检查了Compact Framework和regular Framework中Form的实现。不幸的是,我无法看到紧凑框架中Form的确切实现,但我能够查看应该类似的常规实现。

Close的实现设置了一个标志,窗体将被关闭,然后发送WM_CLOSE到窗口。设置DialogResult只在Form中设置一个私有变量。现在,我知道您在想什么,"但是,我知道设置DialogResult关闭表单!"大家都知道!"理解这种行为的关键在于它是如何发生的。当你调用Form.ShowDialog()时,它会为模态窗体创建一个新的窗口消息循环。这将创建一个处理窗口消息的循环。此循环的终止条件包括检查用户是否从Close期间设置的布尔值调用Close()和/或是否设置了DialogResult。因此,设置DialogResult将导致消息循环终止并关闭表单。

据我所知,隐藏表单的问题是你正在设置DialogResult,但是当你隐藏表单时,我相信窗口不再接收窗口消息。因此,在检查DialogResult的值之前,消息循环可能正在等待下一条消息。

您可以通过获取窗体的句柄并向其发送WM_CLOSE来进行实验,但我认为绕过关闭窗体的预期方法以节省几秒钟的时间,可能不值得为这种黑客可能未知的行为付出代价。