我最近创建了一个简单的自定义消息框。它只是另一种使用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);
答案 0 :(得分:1)
我知道这不是你想听到的,但是调用以下代码并不是真的有效:
private void MQButtonNo_Click(object sender, EventArgs e)
{
this.DialogResult = DialogResult.No;
this.Hide();
}
原因是设置DialogResult
与调用Form.Close()
不同。我在Compact Framework和Reflector中的常规Framework中检查了Form的实现。遗憾的是,我无法在Compact Framework中看到Form的确切实现,但我能够查看应该类似的常规实现。
Close的实现设置了一个要关闭Form的标志,然后将WM_CLOSE发送到窗口。设置DialogResult
仅在表单中设置私有变量。现在,我知道你在想什么,“但是,我知道设置DialogResult
关闭表格!每个人都知道!”。理解这种行为的关键是如何发生这种情况。当你调用Form.ShowDialog()
时,它会为模态表单创建一个新的窗口消息循环。这将创建一个处理窗口消息的循环。此循环的终止条件包括检查用户是否从关闭期间设置的布尔值调用Close()和/或是否设置了DialogResult
。因此,设置DialogResult
将导致消息循环终止并关闭表单。
据我所知,隐藏表单的问题在于您正在设置DialogResult
,但是当您隐藏表单时,我相信Window不再接收Window消息。因此,消息循环可能在检查DialogResult
的值之前等待下一条消息。
你可以通过获取Form的句柄并将其发送给WM_CLOSE来试验这个,但是我想想绕过关闭Form的预期方法来刮掉几秒钟所花费的时间,可能不值得这种黑客行为可能未知行为的代价。