如何保持从主程序重新启动 windows 表单,直到另一个 window 表单退出应用程序?
How to keep re-launching a windows form from the main program until another window form exits the application?
我有一个 C# windows 程序,它有两种形式,通过 RunApplication 从主程序线程连续打开。执行流程本质上是:
- 用户运行Setup.exe,启动主程序线程(Setup.cs)
- 主程序启动表单 A,显示可用配置文件的列表视图
- 用户选择一个,点击下一步,Form A关闭
- 主程序线程加载选择的配置文件
主程序线程启动表单 B
Application.Run(new FormB { Size = new Size(530, 421) });
- 表单 B 有许多选项卡,这些选项卡可能会显示也可能不会显示,具体取决于所选的配置文件;用户单击此表单上的“下一步”/“返回”以在选项卡之间导航
- 如果用户位于表单 B 的选项卡索引 0 处并且用户单击“后退”按钮,表单 B 应关闭并允许表单 A 再次显示
最后一点是我遇到了一些问题 - 我希望当用户单击表单 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();
}
}
}
我有一个 C# windows 程序,它有两种形式,通过 RunApplication 从主程序线程连续打开。执行流程本质上是:
- 用户运行Setup.exe,启动主程序线程(Setup.cs)
- 主程序启动表单 A,显示可用配置文件的列表视图
- 用户选择一个,点击下一步,Form A关闭
- 主程序线程加载选择的配置文件
主程序线程启动表单 B
Application.Run(new FormB { Size = new Size(530, 421) });
- 表单 B 有许多选项卡,这些选项卡可能会显示也可能不会显示,具体取决于所选的配置文件;用户单击此表单上的“下一步”/“返回”以在选项卡之间导航
- 如果用户位于表单 B 的选项卡索引 0 处并且用户单击“后退”按钮,表单 B 应关闭并允许表单 A 再次显示
最后一点是我遇到了一些问题 - 我希望当用户单击表单 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();
}
}
}