Проблемы с этой строкой:
Application.Run(new Form1());
Что, вероятно, можно найти в вашем файле program.cs.
Эта строка указывает, что form1 предназначена для обработки цикла сообщенийДругими словами, form1 отвечает за выполнение вашего приложения - приложение будет закрыто при закрытии формы 1.
Есть несколько способов справиться с этим, но все они так или иначе не закроют форму1.(Если только мы не изменим тип проекта на что-то кроме приложения Windows Forms)
Мне кажется, что в вашей ситуации проще всего создать 3 формы:
form1 - останется невидимым и выступит в роли менеджера, вы можете назначить его для обработки иконки в трее, если хотите.
form2 -будет иметь кнопку, которая при нажатии закроет форму 2 и откроет форму 3
форма 3 - будет играть роль другой формы, которую необходимо открыть.
А вот пример кода для этого:(Я также добавил пример закрытия приложения из 3-й формы)
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); //set the only message pump to form1.
}
}
public partial class Form1 : Form
{
public static Form1 Form1Instance;
public Form1()
{
//Everyone eveywhere in the app should know me as Form1.Form1Instance
Form1Instance = this;
//Make sure I am kept hidden
WindowState = FormWindowState.Minimized;
ShowInTaskbar = false;
Visible = false;
InitializeComponent();
//Open a managed form - the one the user sees..
var form2 = new Form2();
form2.Show();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var form3 = new Form3(); //create an instance of form 3
Hide(); //hide me (form2)
form3.Show(); //show form3
Close(); //close me (form2), since form1 is the message loop - no problem.
}
}
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1.
}
}
Примечание: работа с панелями или динамическая загрузка пользовательских элементов управления более академичны и предпочтительнее отраслевых стандартов производства - но мне кажется, вы просто пытаетесь рассуждать о том, как все работает - для этой цели этот пример лучше.
И теперь, когда принципы понятны, давайте попробуем это с двумя формами:
Первая форма будет играть роль менеджера, как в предыдущем примере, нотакже будет представлен первый экран - поэтому он не будет закрыт просто скрытым.
Вторая форма будет играть роль показа следующего экрана и, нажав кнопку, закроет приложение.
public partial class Form1 : Form
{
public static Form1 Form1Instance;
public Form1()
{
//Everyone eveywhere in the app show know me as Form1.Form1Instance
Form1Instance = this;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Make sure I am kept hidden
WindowState = FormWindowState.Minimized;
ShowInTaskbar = false;
Visible = false;
//Open another form
var form2 = new Form2
{
//since we open it from a minimezed window - it will not be focused unless we put it as TopMost.
TopMost = true
};
form2.Show();
//now that that it is topmost and shown - we want to set its behavior to be normal window again.
form2.TopMost = false;
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form1.Form1Instance.Close();
}
}
Если вы изменили предыдущий пример - удалите форму 3 из проекта.
Удачи.