如何保持从主程序重新启动 windows 表单,直到另一个 window 表单退出应用程序?

How to keep re-launching a windows form from the main program until another window form exits the application?

我有一个 C# windows 程序,它有两种形式,通过 RunApplication 从主程序线程连续打开。执行流程本质上是:

最后一点是我遇到了一些问题 - 我希望当用户单击表单 B 上的后退按钮并且选项卡索引为 0 时,我可以设置一些 public 静态变量表示是'return'模式,在主线程中重新启动Form A。但是,我不能使用一个简单的循环来说明虽然它不是 ExitMode(并且是 ReturnMode),但会启动 Form B,因为它会重复 open/close Form B 的一个实例。我想我可以将循环条件设置为说如果它是 ReturnMode 并且 Form B 尚未启动,则启动 Form B - 但在关闭 Form B 之前反复检查似乎很糟糕。 (这里需要线程吗?)

我还想也许我可以在表单 B 中启动表单 A - 例如,如果选定的选项卡索引为 0,则表单 B 的 btnBack_Click 运行一个函数来启动表单 A。因为我不能在另一个 Application.() 中启动 Application.Run(),我创建了一个 Form A 的实例并尝试了 formA.Show()。但是,如果我这样做,表单 B 会在后台徘徊,我似乎无法在不关闭表单 A 的情况下关闭它。

FormA form_a = new FormA { Size = new Size(530, 421) };                

FormB install_screens_active = Application.OpenForms["FormB"];
FormA.Show();

if (install_screens_active != null)
{ 
    install_screens_active.Close();
}

您可以将对主线程的引用传递给表单 B。从那里,如果用户在索引为 0 时按下表单 B 上的后退按钮,则在引用的线程上调用将关闭表单 B 的方法并打开表格 A.

这样的事情怎么样?

static class Program
{
    static void Main()
    {
        do
        {
            var formA = new FormA();
            Application.Run(formA);
            var formB = new FormB(formA.SelectedConfigurationFile);
            Application.Run(formB);
        } while (!IsComplete);
    }

    public static IsComplete { get; set;}
}

public class FormB
{
    protected override void OnFormClosed(FormClosedEventArgs e)
    {
        base.OnFormClosed(e);
        if (e.CloseReason == CloseReason.UserClosing)
            Program.IsComplete = true;
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
        Program.IsComplete = true;
        Close();
    }

    private void btnBack_Click(object sender, EventArgs e)
    {
        if (this.Tabs.SelectedIndex == 0)
        {
            Program.IsComplete = false;
            Close();
        }
    }
}