2013-05-28 3 views
0

У меня есть следующая задача.Закрытие фоновой формы из формы переднего плана в C# wpf

Шаги:

Форма А открывается вид В на нажатие кнопки

Ожидаемое:

Форма B начала и форма А закрывается.

Результат:

Форма B начинается, но форма А остается на заднем плане.

Я попытался решить проблему, передав ссылку формы A в форму B, но это странно не работает.

В Form A :(MainWindow)

AdminWindow window = new AdminWindow(); 
window.setCreatingForm = this; 
window.Show(); 

В Form B: (AdminWindow)

public Window setCreatingForm 
{ 
    get { return creatingForm; } 
    set { creatingForm = value; } 
} 

public Window creatingForm { get; set; } 

private void logOutClick(object sender, RoutedEventArgs e) 
{ 
    if (creatingForm != null) 
     creatingForm.Close(); `// Why does this not close the background Form` 
    MainWindow window = new MainWindow(); 
    window.Show(); 
} 

ответ

1

Установите видимое свойство родительской формы к ложным.

 public Form1() 
     { 
      InitializeComponent();   
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      var form = new Form2(); 
      form.Show(); 
      this.Visible = false; 
     } 
+0

Это для нормальной формы WIndows. Я понял, что нет атрибута «Видимый» для формы в WPF. Однако я получил вашу идею и нашел эквивалентный атрибут в WPF. Его называют «Скрыть», поэтому вместо этого. Видимо, мне нужно сделать это. Скрыть. Благодаря ! – rockstar

2

У меня нет большого опыта работы с WPF, но на основе одного из Windows Forms, я думаю, проще всего было бы, чтобы закрыть форму А сразу после запуска формы B:

// form A code for launching B 
AdminWindow window = new AdminWindow(); 
window.setCreatingForm = this; 
window.Show(); 
this.Close(); 

выше должно работать, потому что метод запуска формы B не завершает или не блокирует после вызова window.Show(). Вызов блокируется только при отображении модального окна (которое в Формах Вдовов выполняется с помощью window.ShowDialog()).

Что касается того, почему Close() в вашем коде не работает, похоже, что после уничтожения формы A вы создаете и показываете новую форму того же типа, и, возможно, оригинальная форма закрыта, но то, что вы видите, вновь созданный.

PS: Неплохая практика включает в себя набор или получить имя .Net. Поведение set и get добавляется путем определения методов set и get для свойства. Поэтому в вашем коде для AdminWindow свойство для создающей формы должно быть названо CreatingForm вместо setCreatingForm.

+0

Спасибо, я советую. Я решил свою проблему, используя WPF Api «Hide». Поэтому this.Hide() в wpf был тем, что я искал. +1 за помощь. – rockstar

+1

@rockstar, просто обратите внимание, что закрытие и скрытие - это две разные вещи. Закрытие не только удаляет форму из пользовательского интерфейса, но также очищает все связанные с ней ресурсы. Скрыть не выполняет очищающую часть, и обычно вы используете скрыть, когда вам нужно переустановить тот же экземпляр формы (un-hide) на более позднем этапе. Если вы скрываете форму, а затем создаете новую, когда вы показываете ее снова, вы тратите ресурсы. –

Смежные вопросы