[英]DialogResult.Cancel on Form.ShowDialog() when switching to Desktop
[英]Form in C# returns DialogResult.Cancel to Parent When It is Minimized
我有一个窗体“ 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的结果,否则,我认为它们将要取消并返回Cancel。 ..
如果用户指定取消并假设有人试图最小化取消,我是否唯一的途径是从新表单中返回中止? 这似乎很奇怪
这完全是设计使然。 当您隐藏模式对话框时,用户将无法返回程序。 对话框没有任务栏按钮,应用程序中的其余窗口均被禁用,因此无法激活。 用户拥有的唯一途径就是使用任务管理器终止程序。
因此,Winforms会执行逻辑操作,它会自动关闭对话框以避免此UI陷阱。 当然,您将获得DialogResult.Cancel。
使用正确的UI设计,对话框应始终将其MinimizeBox属性设置为False。
我不确定您要达到的目标。 但是,要使Dialog返回其他任何内容,必须在关闭窗体之前在窗体的(Dialog)的DialogResult属性中进行设置。
您也可以使用对话框的Form_Closing事件将DialogResult属性设置为所需的属性。 这是在窗体关闭之前完成的。
您可以通过多种方式处理此问题,一种方法如下所示:
MainTestForm mainTestForm = new MainTestForm();
if (mainTestForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
{
return;
}
当您关闭窗体时,您必须设置DialogResult状态
this.DialogResult = System.Windows.Forms.DialogResult.OK;
我希望这有帮助。
这是MSDN关于ShowDialog的报价:
调用此方法时,直到关闭对话框后,该代码之后的代码才会执行。
进一步阅读后,它会指出X不会关闭表单而是将其隐藏,因此您必须处理它:
当窗体显示为模式对话框时,单击“关闭”按钮(窗体右上角带有X的按钮)将导致窗体被隐藏,并且DialogResult属性被设置为DialogResult.Cancel。 当用户单击对话框的“关闭”按钮或设置DialogResult属性的值时,不会自动调用Close方法。 而是隐藏该窗体,并且可以在不创建对话框的新实例的情况下再次显示该窗体。 由于这种行为,当您的应用程序不再需要该表单时,您必须调用该表单的Dispose方法。
似乎相同的问题也适用于最小化用户表单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.