Я предполагаю, что ваш Form1
также создан и передан Application.Run()
в вашем main
методе, верно? Что-то вроде Application.Run(new Form1());
В этом случае (который используется по умолчанию) вы указываете платформе выйти из приложения, когда эта форма закрывается.
Возможно, вы захотите изменить метод main
на использование перегрузки Application.Run()
, которая принимает ApplicationContext , и в контексте приложения создайте свои формы - затем, когда закроется последняя форма, вы можете выйти из приложения. Пример в ссылке на MSDN показывает очень похожий случай.
Вы можете просто изменить main на:
Form1 newForm = new Form1();
newForm.Show();
Application.Run();
но проблема в том, что приложение может некорректно завершить работу без дополнительной уборки.
Добавлено:
Это простой пример, но показывает концепцию. Создайте класс ApplicationContext, как этот:
public class CustomContext : ApplicationContext
{
private readonly List<Form1> _openForms = new List<Form1>();
public CustomContext()
{
CreateForm();
}
private void CreateForm()
{
Form1 form = new Form1();
form.OpenNewForm += (sender, args) => CreateForm();
form.Closed += (sender, args) => FormClosed(sender as Form1);
_openForms.Add(form);
form.Show();
}
private void FormClosed(Form1 form)
{
_openForms.Remove(form);
if (_openForms.Count == 0)
{
ExitThread();
}
}
}
В вашем Program
классе измените main на Run(..)
ваш новый контекстный класс:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new CustomContext());
}
А затем в вашей Form1 убедитесь, что у вас есть событие, и инициируйте это событие, чтобы открыть новые формы (обратите внимание, что в «реальном» коде я бы, вероятно, абстрагировал это, или, скорее всего, мой контейнер DI обрабатывал регистрацию, но это показывает гораздо более ясный смысл):
public event EventHandler OpenNewForm;
private void ButtonClick(object sender, EventArgs e)
{
//instead of showing a new form, we just raise this event
if (OpenNewForm != null) OpenNewForm(this, EventArgs.Empty);
}
Это позволяет приложению ApplicationContext управлять открытыми формами, так что закрытие первой (или любой из них) не приводит к выходу из приложения, пока вы не закроете последнюю . Как только последняя форма закрывается, она выходит из приложения.