繁体   English   中英

C#中的窗体将DialogResult.Cancel最小化时返回给父对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM