C # — Строка заголовка «X» не закрывает программу и переключение форм

#c# #user-interface #windows-forms-designer

#c# #пользовательский интерфейс #windows-forms-designer

Вопрос:

У меня есть проект Visual C # с использованием windowsforms, который не завершается при нажатии на X в любой форме, отличной от первой формы. Я думаю, это может иметь какое-то отношение к переключению моей формы?

В настоящее время у меня есть шаблон.CS — это именно то, на что это похоже. Все мои формы использования расширяют это на:

 public partial class Welcome : ADL.template
  

Затем я переключаюсь между формами, вызывая этот метод:

     public static void formSwitch(Form in_form, Form out_form)
    {
        in_form.Hide();
        out_form.Show();          
    }
  

Вызывается:

 Program.formSwitch(this, new frmUserInput());
  

Я думаю, что здесь происходит то, что X закрывает форму, а не приложение, потому что начальная форма скрыта, а не закрыта. Есть ли лучший способ для меня переключаться между формами?

Спасибо!

Комментарии:

1. Вы пытались перезаписать функцию закрытия вашей формы, чтобы закрыть приложение оттуда?

Ответ №1:

Прежде чем ответить на ваш вопрос, я должен указать, что Hide на самом деле ваша форма не закрывается, она только (как следует из названия) скрывает ее. Таким образом, со временем вы будете продолжать накапливать формы, пока у вас не закончатся объекты GDI или память, в любом случае вы потерпите крах.

Вы отчасти правы в отношении причины, по которой ваше приложение не закрывается: хотя вы закрываете текущую форму, все ваши другие формы все еще загружены, поэтому ваше приложение не завершится.

Чтобы исправить это, лучшим способом было бы фактически закрыть ваши формы, когда они вам больше не нужны. Тогда вам даже не придется добавлять какой-либо код, чтобы закрыть ваше приложение.

Теперь, если вы по какой-либо причине не хотите этого делать, вы всегда можете просто вызвать Application.Exit . Я настоятельно не рекомендую вам использовать это «решение».

Редактировать: что касается возможного решения, вы могли бы изменить Program.cs на что-то вроде:

 static class Program
{
  static Form NextForm=new frmLogin();   // or whatever your first form is
  static public void SetNext(Form next) { NextForm=next; }
  static void Main()
  { 
    while(NextForm!=null)
    {
      Form _next=NextForm;
      NextForm=null;      // so it closes at the end
      Application.Run(NextForm);
    }
  }
}
  

И тогда ваш formSwitch стал бы:

 public static void formSwitch(Form in_form, Form out_form)
{
    Program.SetNext(out_form);
    in_form.Close();
}
  

Это выглядит странно, потому что ваш рабочий процесс странный для программы Windows. Это больше похоже на рабочий процесс программы FORTRAN 1970 года, работающей в DOS.

Комментарии:

1. Блинди, спасибо! Хотя это моя проблема. в функции formSwitch, если я изменяю «Скрыть» на «Закрыть», приложение завершает работу. Каков лучший способ переключения форм?

2. Спасибо, blindy, высоко ценится. Пытаюсь сейчас. Что касается моего рабочего процесса, что было бы лучшим способом сделать что-то? Использование 1 формы и удаление / добавление элементов?

3. @Blindy: 1 для ссылки на FORTRAN. @coderego: Использование одной формы является «обычным» способом написания приложений Windows. Добавлять / удалять элементы (панели) или использовать модальные диалоги — зависит от вас.

4. @coderego, на ум приходит диалоговое окно мастера с кнопками «Назад» и «Вперед», если это понятный, конечный процесс. Еще лучшим способом было бы использовать некоторую сетку и позволить пользователю заполнять все данные одновременно. Это зависит от того, что именно делает ваше приложение, вы не объяснили его функцию.

5. Это программа типа мастера. Несколько шагов, каждый из которых принимает пользовательский ввод, выполняет некоторую скрытую работу, дает обратную связь и запрашивает дополнительные данные.

Ответ №2:

Поведение приложения Windows Forms по умолчанию таково: приложение закрывается при закрытии ГЛАВНОГО окна.

Главное окно является первым, которое вы создали. Когда вы вызываете Hide() это окно, оно становится невидимым (но все еще существует). Таким образом, закрытие второго окна не закрывает приложение.

Комментарии:

1. Да, я так и думал, что проблема была в этом. Какой тогда лучший способ справиться с переключением форм? Если я изменю Hide () на Close () в этой функции, программа завершится!

2. Как предлагалось выше, поместите Application.Exit() в OnClose обработчик второй формы.

Ответ №3:

Вы можете отредактировать код в ~/Program.cs файле следующим образом:

 static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Form f = new Form();
        f.Show();

        Application.Run();
    }
}
  

Таким образом, приложение не закроется, пока вы не вызовете Application.Exit() эксклюзивно.