2009-07-21 3 views
1

Я создаю приложение wpf в C#, я знаю, чтобы закрыть/открыть окно, которое вы должны использовать методы .Close() и .Show(), но по какой-то причине домашний экран, первое окно, которое появляется при запуске приложения, не будет закрыто.Как закрыть домашнее окно

 Home window1 = new Home(); 
     window1.Close(); 
     Name window2 = new Name(); 
     window2.Show(); 

Window2 появляется, но окно1 не закрывается. В чем проблема.

ответ

1

Предположительно, потому что, если вы закроете окно, вы закроете приложение.

Если вы просто хотите скрыть основное окно, используйте метод window.Hide().

Это от помощи на Window.Close:

Окно может быть закрыто с помощью одного из нескольких, хорошо известных, системных предоставляемого механизмов, расположенных в строке заголовка, в том числе:

ALT + F4.

Системное меню | Закрыть.

Закрыть кнопка.

Окно также можно закрыть один из нескольких хорошо известных механизмов в пределах клиентской области, которые предоставляются разработчиками, в том числе:

Файл | Выход в главном окне.

| Закрыть или Закрыть button on a child window.

UPDATE

Tormod Fjeldskår имеет хорошую точку в своем ответе. Я предположил, что код был приведен в качестве примера, а не тем, что на самом деле используется.

1

Где находится код для показа window1? Если вы покажете свое домашнее окно в другом месте вашего кода, вам нужно использовать эту ссылку, чтобы закрыть ее. Создание нового объекта Home и вызов его метода Close не закроют окно, показанное с использованием другого объекта Home.

+0

Я заметил, что при вызове метода близко, он не закрывает предыдущее окно. Например, если я открываю окно1 и открываю окно2, я не могу закрыть окно1, но я МОГУ закрыть окно2. Тогда, когда у меня есть window2 open и open window3, я не могу закрыть window1 или window2, но я могу закрыть window3. И это продолжается, только последнее окно может быть закрыто, ничего ранее не может. Как закрыть предыдущие окна. – Jake

+0

Где вы храните ссылки на объекты вашего окна? –

0

Если закрыть окно не нужно, просто спрячьте их.

0

Или вы можете иметь Window2 в главном окне (вы можете изменить это в app.xaml в свойстве StartUpUri) и либо показать Window2, либо закрыть Window1, либо вообще не показывать Window1.

<Application x:Class="Invitrogen.TheGadget.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    StartupUri="Window2.xaml"> 
</Application> 
1

Это ошибка в WPF. Window.Close будет терпеть неудачу, если событие SourceInitialized еще не произошло. Последующие вызовы Window.Close также потерпят неудачу.

https://connect.microsoft.com/WPF/feedback/ViewFeedback.aspx?FeedbackID=299100

Для решения проблемы, добавьте в ваше окно:

protected override void OnSourceInitialized(EventArgs e) 
{ 
    base.OnSourceInitialized(e); 

    // check if we've already been closed 
    if (m_bClosed) 
    { 
     // close the window now 
     Close(); 
    } 
} 

protected override void OnClosing(CancelEventArgs e) 
{ 
    base.OnClosing(e); 

    // make sure close wasn't cancelled 
    if (!e.Cancel) 
    { 
     // mark window as closed 
     m_bClosed = true; 

     // if our source isn't initialized yet, Close won't actually work, 
     // so we cancel this close and rely on SourceInitialized to close 
     // the window 
     if (new WindowInteropHelper(this).Handle == IntPtr.Zero) 
      e.Cancel = true; 
    } 
} 

bool m_bClosed; 
Смежные вопросы