2014-10-18 3 views
2

В моем приложении с окнами Windows C# есть 5 форм, которые я показываю один за другим. Когда пользователь нажимает на следующей кнопке, код, который я дал это:Методы this.hide() vs this.close()

new Form1().Show(); 
this.Hide(); 

Однако я не хочу, чтобы моя текущая форму, чтобы скрыть. Я хочу закрыть его/распорядиться им, чтобы он не потреблял память. Я хочу выпустить его ресурсы, такие как изображения и переменные, которые будут использоваться, как только я закончу это. Для этого я попытался реализации:

new Form1().Show(); 
this.Close(); //Form 2 

, но это просто закрывает обе формы. Я даже попробовал поменять местами позиции выше двух линий:

this.Close(); 
new Form1().Show(); 

, но это также делает то же самое.

Как освободить ресурсы одной формы, как только я покончу с этим? потому что моя программа выбрасывает исключения памяти при попытке повторно открыть свою форму 2 с помощью:

new Form2().Show(); 
this.Hide(); 
+4

Если вы закрываете основная форма, ваше приложение закроется ... –

+1

Установите параметр (в разделе «Мой проект»), чтобы «выйти, когда последнее окно закрывается» (или что бы это ни было). – Ryan

+0

@minitech Я думаю, что эта опция доступна только в VB.NET, на C# вам придется ее реализовать самостоятельно, если это возможно. –

ответ

1

Закрыв форму, запустить программу в своей основной функции будет закрыть приложение, идея должна иметь родителя Форма и сделать ее основной формой, и никогда не закрывайте ее, это может быть скрытая форма, если вы хотите.

Я не работаю с формами Windows, начиная с давно, но найти на этой странице причина поведения вы получаете:
http://msdn.microsoft.com/en-us/library/ms157902(v=vs.110).aspx

Как правило, основная функция приложения вызывает этот метод и переходит к нему в главном окне приложения. Этот метод добавляет обработчик события к параметру mainForm для события Closed. Обработчик события вызывает ExitThread для очистки приложения.

Также по этому вопросу How do I prevent the app from terminating when I close the startup form? была дискуссия о чем-то же

4

Вы можете начать свой NewForm в новом thread и создать новый цикл сообщений

Когда основной цикл обработки сообщений закрыто, приложение завершает работу. В Windows Forms этот цикл закрывается, когда вызывается метод Exit

Для получения дополнительной информации см. here.

var th = new Thread(() => Application.Run(new NewForm())); 
th.SetApartmentState(ApartmentState.STA); // Deprecation Fix 
th.Start(); 

this.Close(); 
2

Другой способ сделать это - управлять контекстом приложения самостоятельно.Вот небольшая демонстрация:

[STAThread] 
static void Main() 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    using (var myApplicationContext = new MyApplicationContext(new Form1())) 
    { 
     Application.Run(myApplicationContext); 
    } 
} 

Вы можете определить заказуНаша сделаны ApplicationContext следующим образом:

public class MyApplicationContext : ApplicationContext 
{ 
    public MyApplicationContext(Form mainForm) 
     :base(mainForm) 
    { 
    } 

    protected override void OnMainFormClosed(object sender, EventArgs e) 
    { 
     if (Form.ActiveForm != null) 
     { 
      this.MainForm = Form.ActiveForm; 
     } 
     else 
     { 
      base.OnMainFormClosed(sender, e); 
     } 
    } 
} 

И теперь, вы можете сделать следующее на обработчик Button.Click события:

var f = new Form(); 
f.Show(); 
this.Close(); 

И приложение будет продолжать работать. В основном, таким образом, вы сохраняете приложение, пока есть хотя бы одна активная форма.

ПРИМЕЧАНИЕ Не проверял его, но он должен работать.

0

По умолчанию приложение C# Forms создает «корневую» форму в методе Program.Main() и передает его методу Application.Run(). Когда эта форма закрыта, ваша программа выйдет из системы.

Однако вы можете изменить это поведение, используя другую загрузку приложения.Run(). Просто не передавайте экземпляр формы в Run(). Вместо этого покажите форму перед вызовом Application.Run(), а затем (когда вы, наконец, хотите, чтобы программа завершила работу), используйте метод Application.ExitThread(), чтобы сообщить классу приложения, что вы готовы закрыть приложение.

1

Я не уверен, что это сработает для вас. Но когда у меня была такая же проблема при работе с формой входа ... я просто использовал ShowDialog() вместо Show(), (и для меня это решило проблему) Just Like:

 this.Hide(); 
     MainForm MForm = new MainForm(); 
     MForm.ShowDialog(); 
     this.Close();