1

我最近创建了一个简单的自定义消息框。它只是使用 ShowDialog() 调用的另一种形式。

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

但是,当我这样做时,整个应用程序都会关闭。使用 this.Close() 时不会发生这种情况。我选择使用隐藏的原因是因为响应似乎更快。使用关闭时,消息框窗体会在关闭前停留 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);
4

1 回答 1

1

我知道这不是您想听到的,但是调用以下代码并不是真的有效:

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

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

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

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

您可以通过获取表单的句柄并将其发送 WM_CLOSE 来对此进行试验,但我想绕过关闭表单的预期方法以缩短几秒钟所需的时间,可能不值得花费这种黑客可能不为人知的行为。

于 2013-05-07T14:36:45.303 回答