#c# #forms #showdialog
#c# #формы #показать dialog
Вопрос:
Когда запускается автоматически созданный код для моей программы, он вызывает
Application.Run(new Form1());
и запускает Form1. У меня есть другая форма, на которую я хотел бы переключиться и закрыть Form1 одновременно. Проблема в том, что если я использую «это.Закройте ()» в Form1, прежде чем я вызову другую форму с помощью «Form.ShowDialog()», после чего программа завершится. Если я помещаю его после ShowDialog, то он остается в фоновом режиме, пока я не закрою Form2, после чего программа завершается.
Как я могу создать копию Frame2, одновременно закрывая открытый в данный момент фрейм?
редактировать: я пытался вызвать Frame2 с помощью .Show() также, но новый фрейм закрывается мгновенно.
Комментарии:
1. если Form2 вызывается Form1 как модальная форма с ShowDialog, почему вы хотите скрыть вызывающую форму?
2. Давиде, на самом деле я хотел бы вызвать это без модуляции с помощью Show, но окно немедленно закрывается.
3. Я исправил свой ответ, чтобы показать вам, как изменить цикл сообщений для немодальных форм.
Ответ №1:
Следующее решение работает так, как вы ожидаете.
Чтобы попробовать этот пример кода, создайте новое приложение WinForms в Visual Studio (т.е. Файл -> Новый проект, выберите Visual C # -> Windows Classic Desktop и используйте шаблон «Приложение Windows Forms (.NET Framework)»), затем добавьте вторую форму.
Убедитесь, что две формы названы как Form1
и Form2
, затем измените код в сгенерированном решении следующим образом:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.FormClosed =
new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
(new Form2()).Show();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
this.FormClosed =
new System.Windows.Forms.FormClosedEventHandler(this.Form2_FormClosed);
}
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
}
И это точка входа в приложение, измените ее следующим образом:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//Show first form and start the message loop
(new Form1()).Show();
Application.Run(); // needed, otherwise app closes immediately
}
}
Хитрость заключается в использовании Application.Run() без параметров и приложения.Exit() в точке, где вы хотите выйти из приложения.
Теперь, когда вы запускаете приложение, Form1
открывается. Нажмите на X (верхний правый угол), и Form1 закроется, но Form2
вместо этого появится. Нажмите на X еще раз, и форма закроется (и также выйдет из приложения).
Вместо того, чтобы помещать запуск Form2
в событие FormClosed, вы также могли бы создать кнопку, Button1 которая выполняет эту работу, но в этом случае не забудьте закрыть форму, к которой относится кнопка, через this.Close()
явно:
private void button1_Click(object sender, EventArgs e)
{
(new Form2()).Show(); this.Close();
}
Ответ №2:
Вам нужно вызвать, this.Hide()
который делает его невидимым, но все еще открытым, вместо this.Close()
того, который его закрывает (и, поскольку это основная форма приложения, приложение тоже закрывается).
Комментарии:
1. Если я скрою форму, как мне вернуться к ней из Form2, когда я закончу там? Я не могу вызвать Form1.Show () изнутри методов Form2?
2. @rumsey: ShowDialog будет ждать, пока Form2 не будет закрыт, поэтому после вызова ShowDialog() вызовите это. Показать().
3. Простое скрытие сохраняет его в памяти, что нормально, если вы захотите повторно открыть его позже. В противном случае лучше закрыть его.
Ответ №3:
Нашел этот вопрос и codeproject в том же Google.
Автор в основном создает форму верхнего уровня, которая управляет переключением между формами, которые он хочет показать.