Скрытие формы и отображение другой при нажатии кнопки в приложении Windows Forms
Я делаю приложение приложение Windows Form. Сначала появляется определенная форма, и после того, как пользователь нажимает следующую кнопку, эта форма должна быть скрыта и показана другая форма.
Я пытался сделать это. Мне удалось скрыть текущую форму, но следующая не появится.
Вот моя попытка:
Это обработчик событий кнопки
private void button1_Click_1(object sender, EventArgs e)
{
if (richTextBox1.Text != null)
{
this.Visible=false;
}
else
MessageBox.Show("Insert Attributes First !");
}
Это основная функция:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Form2 form2 = new Form2();
Form1 form1 = new Form1();
form2.Hide();
Application.Run(form1);
while (true)
{
if (form1.Visible == false)
form2.Show();
}
}
6 ответов:
Оператор While не будет выполняться до тех пор, пока form1 не будет закрыт - поскольку он находится вне основного цикла сообщений.
Удалите его и измените Первый БИТ кода на:
Однако это не лучший способ достичь того, что вы хотите сделать. Вместо этого рассмотрим шаблон проектированияWizard .private void button1_Click_1(object sender, EventArgs e) { if (richTextBox1.Text != null) { this.Visible=false; Form2 form2 = new Form2(); form2.show(); } else MessageBox.Show("Insert Attributes First !"); }В качестве альтернативы можно реализовать пользовательский ApplicationContext, который обрабатывает время жизни обеих форм. Пример реализации заставки здесь, которая должна установить вы на правильном пути.
Http://www.codeproject.com/KB/cs/applicationcontextsplash.aspx?display=Print
A) основной поток графического интерфейса будет работать бесконечно при вызове приложения.Бегите, так что ваш цикл while никогда не будет достигнут
B) вы никогда не захотите иметь бесконечный цикл, подобный этому (цикл while(true)) - он просто заморозит поток. Не совсем понимаю, чего вы там добиваетесь.Я бы создал и показал "основную" (начальную) форму в методе Main (как это делает для вас Visual Studio по умолчанию). Затем в обработчике кнопок создайте другую форму и также покажите ее как скрыть основную форму (не закрывая ее). Затем убедитесь, что основная форма отображается снова, когда эта форма закрывается через событие. Пример:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 otherForm = new Form2(); otherForm.FormClosed += new FormClosedEventHandler(otherForm_FormClosed); this.Hide(); otherForm.Show(); } void otherForm_FormClosed(object sender, FormClosedEventArgs e) { this.Show(); } }
Что-нибудь после применения.Run () будет выполняться только при закрытии основной формы.
То, что вы можете сделать, это обработать событие
VisibleChangedследующим образом:static Form1 form1; static Form2 form2; static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); form2 = new Form2(); form1 = new Form1(); form2.Hide(); form1.VisibleChanged += OnForm1Changed; Application.Run(form1); } static void OnForm1Changed( object sender, EventArgs args ) { if ( !form1.Visible ) { form2.Show( ); } }
private void button5_Click(object sender, EventArgs e) { this.Visible = false; Form2 login = new Form2(); login.ShowDialog(); }
Для ссылки на форму вам нужно:
Form2 form2 = new Form2(); form2.show(); this.hide();Затем скройте предыдущую форму
Я полагаю, что следующий код будет выполняться только после
form1закрытwhile (true) { if (form1.Visible == false) form2.Show(); }Почему бы вместо этого не начать свой
form2сform1?Form2 form2 = new Form2(); private void button1_Click_1(object sender, EventArgs e) { if (richTextBox1.Text != null) { form1.Visible=false; form2.Show(); } else MessageBox.Show("Insert Attributes First !"); }
Comments