运行时更改应用程序主窗体

4
我希望在点击按钮时重新启动我的主窗体。例如:
在 program.cs 中:
Application.Run(new MainForm(data))

在 MainForm.cs 文件中:
private void btn1_Click(object sender, EventArgs e)
{
    MainForm newForm = new MainForm(newData);
    this.close();
    Application.Run(newForm);
}

所以我的新主窗口是MainForm的新实例。我该如何做到这一点,以使第一个实例从内存中清除?
编辑 即我想让我第一个MainForm实例完全消失 - 这是否与仅调用this.Hide()相同?或者调用this.Close(),然后设置它,以便应用程序仅在关闭最后一个窗口时退出,而不是在关闭主窗口时退出?
2个回答

2

不可以在单个线程上启动第二个消息循环,这是无效的操作。您可以使用 Form.ShowDialog 替代:

Hide();
MainForm newForm = new MainForm(newData);
newForm.Closed += (s, args) => Close();
newForm.ShowDialog();

或者如果你想关闭旧实例:

Hide();
MainForm newForm = new MainForm(newData);
newForm.ShowDialog();
Close();

在这种情况下,我只隐藏了 MainForm 的第一个实例。我想完全销毁它并用新实例替换它。 - user2635088
@user2635088 ... 在这种情况下,您隐藏了第一个实例并创建并显示了新实例。当您想关闭新实例时,旧实例也会关闭和销毁。 - Salah Akbari
但我想立即关闭旧实例,而不是在新实例关闭时。 - user2635088
@user2635088 ... 好的,那么在 newForm.ShowDialog(); 之后加上一行 this.Close(); - Salah Akbari
1
@user2635088...请查看我的更新答案。 - Salah Akbari
在你的回答中,无论哪种情况,只有当newForm关闭时,原始表单的Close()方法才会被触发。 - dynamichael

-1
“这可能吗?”
不可以。 通常,您应该运行示例并进行测试。然后您会自己回答这个问题。 您可能想要做如下操作:
private void button_click(object sender, RoutedEventArgs e)
{
    NextWindow window = new NextWindow();
    window.Show();
    this.Close();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接