我有一个表单“Main”,在Main我正在创建另一个表单,我使用.ShowDialog()来显示它。我这样做是因为我不希望Main中的其余代码在新表单完成之后执行。我允许用户将新表单最小化到系统托盘。
问题:当表单最小化时,它将DialogResult.Cancel返回到调用它的Main表单,导致下一行提前运行。
从主窗体创建表单的代码:
for(int i = 0; i < lvAll.SelectedItems.Count; i++)
{
this.Hide();
this.run = new RunProfile(this.profiles[lvAll.SelectedItems[i].Text]);
DialogResult result = run.ShowDialog();
MessageBox.Show(result.ToString());
}
在新表单中,用户将获得一个复制的文件列表...现在用户可以继续并复制这些文件,我希望返回OK的结果,如果不是,我认为他们将取消和返回取消...
如果用户指定取消并且假设取消是有人试图最小化的话,我是否唯一可以从新表格中退回Abort?这看起来很奇怪
答案 0 :(得分:1)
这完全是设计上的。当您隐藏模式对话框时,用户无法回到该程序。对话框没有任务栏按钮,应用程序中的其余窗口都被禁用,因此无法激活。用户唯一的办法是使用任务管理器终止您的程序。
因此Winforms执行逻辑操作,它会自动关闭对话框以避免此UI陷阱。当然你会得到DialogResult.Cancel。
使用正确的UI设计,对话框应始终将其MinimizeBox属性设置为False。
答案 1 :(得分:0)
我不确定你想要实现的目标。但是,要使Dialog返回其他任何内容,必须在窗体关闭之前在窗体(Dialog)的DialogResult属性中设置它。
您还可以使用对话框的Form_Closing事件将DialogResult属性设置为您想要的。这是在表单关闭之前完成的。
答案 2 :(得分:0)
你可以通过多种方式解决这个问题,其中一种方式如下:
MainTestForm mainTestForm = new MainTestForm();
if (mainTestForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
{
return;
}
关闭表单时必须设置DialogResult状态,如
this.DialogResult = System.Windows.Forms.DialogResult.OK;
我希望这会有所帮助。
答案 3 :(得分:-1)
以下是MSDN关于ShowDialog的引用:
调用此方法时,不执行其后面的代码 直到对话框关闭后。
在进一步阅读之后,它确实声明X不会关闭表格但隐藏它,所以你必须处理它:
当表单显示为模式对话框时,单击“关闭” 按钮(表单右上角带有X的按钮) 导致隐藏窗体并设置DialogResult属性 到DialogResult.Cancel。不会自动调用Close方法 当用户单击对话框的“关闭”按钮或设置时 DialogResult属性的值。相反,表单是隐藏的 可以在不创建对话框的新实例的情况下再次显示。 由于此行为,您必须调用窗体的Dispose方法 当您的申请不再需要表格时。
似乎同样的问题也适用于最小化用户形式。