Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET CF-应用程序在隐藏模式窗体时关闭_C#_Compact Framework - Fatal编程技术网

C# NET CF-应用程序在隐藏模式窗体时关闭

C# NET CF-应用程序在隐藏模式窗体时关闭,c#,compact-framework,C#,Compact Framework,我最近创建了一个简单的自定义消息框。这只是另一种形式,叫做使用ShowDialog() 我有两个按钮YES/NO,用于设置DialogResult值,然后使用this.Hide()隐藏表单 但是,当我执行此操作时,整个应用程序将关闭。使用This.Close()时不会发生这种情况。我选择使用Hide的原因是响应速度似乎更快。使用“关闭”时,消息框窗体会在关闭前停留2-3秒 下面是一些代码: public static void Init() { if (_inst

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

我有两个按钮YES/NO,用于设置DialogResult值,然后使用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();
}
原因是设置
对话框result
与调用
Form.Close()
不同。我在Reflector中检查了Compact框架和regular框架中表单的实现。不幸的是,我无法在契约框架中看到表单的精确实现,但我能够查看应该类似的常规实现

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

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


您可以通过获取表单句柄并将其发送到WM_CLOSE来尝试这一点,但我可以想象,使用预期的关闭表单的方法来节省几秒钟的时间,可能不值得为这种未知的黑客行为付出代价。

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

private void MQButtonNo_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.No;
    this.Hide();
}
原因是设置
对话框result
与调用
Form.Close()
不同。我在Reflector中检查了Compact框架和regular框架中表单的实现。不幸的是,我无法在契约框架中看到表单的精确实现,但我能够查看应该类似的常规实现

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

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


您可以通过获取表单的句柄并将其发送到WM_CLOSE来尝试这一点,但我可以想象,使用预期的关闭表单的方法来节省几秒钟的时间,可能不值得为这种可能未知的黑客行为付出代价。

设置DialogResult将关闭表单。我敢打赌,随后的隐藏电话会引起问题。如果删除这些调用会发生什么?能否显示应用程序的主方法?(您调用Application.Run(…)嗨,Alan,编辑了帖子以包含主方法嗨,Chris,设置DialogResult关闭表单,如前所述。但是,我确实发现应用程序实际上没有关闭。相反,它被最小化了。当您使用
ShowDialog
创建模式对话框时,表单似乎在“切换”到某种效果。该对话框不控制应用程序的焦点——它是处理输入的唯一对话框。如果您“隐藏”它,您希望您的应用程序在该点上能够做什么?设置DialogResult将关闭表单。我敢打赌,随后的隐藏电话会引起问题。如果删除这些调用会发生什么?能否显示应用程序的主方法?(您调用Application.Run(…)嗨,Alan,编辑了帖子以包含主方法嗨,Chris,设置DialogResult关闭表单,如前所述。但是,我确实发现应用程序实际上没有关闭。相反,它被最小化了。当您使用
ShowDialog
创建模式对话框时,表单似乎在“切换”到某种效果。该对话框不控制应用程序的焦点——它是处理输入的唯一对话框。如果你“隐藏”它,你希望你的应用程序是什么