C# C中的窗体返回DialogResult。最小化时,将其取消给父级

C# C中的窗体返回DialogResult。最小化时,将其取消给父级,c#,winforms,C#,Winforms,我有一个主窗体,我正在创建另一个窗体,我使用.ShowDialog来显示它。我之所以这样做,是因为我不希望在新表单完成之前执行代码的其余部分。我允许用户将新表单最小化到系统托盘 问题:当窗体最小化时,它返回DialogResult.Cancel到调用它的主窗体,导致下一行提前运行 从主窗体创建窗体的代码: for(int i = 0; i < lvAll.SelectedItems.Count; i++) { this.Hide(); thi

我有一个主窗体,我正在创建另一个窗体,我使用.ShowDialog来显示它。我之所以这样做,是因为我不希望在新表单完成之前执行代码的其余部分。我允许用户将新表单最小化到系统托盘

问题:当窗体最小化时,它返回DialogResult.Cancel到调用它的主窗体,导致下一行提前运行

从主窗体创建窗体的代码:

    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


如果一个用户指定了一个cancel,并假设一个cancel是有人试图最小化,那么我唯一可以从新表单返回Abort的方法是什么?这看起来很奇怪,我不确定你想用它实现什么。但是,要使对话框返回任何其他内容,必须在关闭窗体之前在窗体对话框的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;

我希望这能有所帮助。

这完全是出于设计。隐藏模式对话框时,用户无法返回程序。对话框没有任务栏按钮,应用程序中的其余窗口被禁用,因此无法激活。用户唯一的办法就是使用任务管理器终止您的程序

因此Winforms会自动关闭对话框以避免这个UI陷阱。当然你会得到DialogResult.Cancel

使用适当的UI设计,对话框的MinimizeBox属性应始终设置为False。

以下是有关ShowDialog的引用:

调用此方法时,不会执行它后面的代码 直到对话框关闭之后

进一步阅读后,它确实声明X不会关闭表单,但会将其隐藏,因此您必须处理它:

当窗体显示为模式对话框时,单击“关闭”按钮 在窗体的右上角用X键单击按钮 使窗体隐藏并设置DialogResult属性 取消。Close方法不会自动调用 当用户单击对话框的关闭按钮或设置 DialogResult属性的值。取而代之的是,表单是隐藏的 可以再次显示,而无需创建对话框的新实例。 由于此行为,必须调用窗体的Dispose方法 当您的申请不再需要该表格时


似乎同样的问题也适用于最小化用户表单。

Minimize不应导致它返回。我尝试了一个空的VB.NET项目,但无法重现您的问题。请在一个空的C项目中尝试,如果问题仍然存在,请告诉我们。如果你能复制,请也包括一个链接到你的样本项目,这样我们就可以尝试我们的机器。有趣的问题,但我认为可以通过重新思考你的方法来避免。对于Windows应用程序,您尝试执行的是非常不寻常的行为,因此不建议这样做。表现良好的软件是一致的和可预测的。我建议不要让模态对话框最小化。如果你必须让它最小化,那么就让它在任务栏上可见。汉斯,处理这种情况的合适替代方案是什么?我一个接一个地为我的程序建模,在第一次完成后弹出新的表单,同时允许最小化,只是不让它成为一个对话框,我会说。该评论中没有任何内容表明它应该是一个。只是用Show来显示它。在FormClosing事件处理程序中实现最小化到systray功能。Show表单位于循环中,它应该连续而不是同时显示新表单-如果我使用。Show相反,当我一次只想显示1个表单时,我可以一次打开多个表单。同样,没有关于ShowDialog的适当或必要的提示。如果要在当前窗体关闭时显示另一个窗体,则只需订阅FormClosing/Closed事件。在发布下一条评论之前,请仔细考虑一下。