2010-07-06 7 views
0

주 폼 위에 표시하고 닫은 다음 즉시 MessageBox.Show()을 사용하여 대화 상자를 표시하는 Windows 양식 응용 프로그램에 양식이 있습니다. 그러나 첫 번째 양식은 여전히 ​​메시지 상자가 표시 될 때 표시되며 메시지 상자에서 확인을 클릭 할 때까지 사라지지 않습니다. 양식의 VisibleChanged 이벤트에 대한 이벤트 처리기에서 메시지 상자를 표시하고 양식과 기본 양식 모두에 Refresh()을 호출하기 위해 대기 중입니다. 메시지 상자를 표시하기 전에 첫 번째 양식이 완전히 사라 졌는지 확인할 수있는 방법이 있습니까?Windows Form을 "완전히"닫으려면 어떻게해야합니까?

편집 :

다음은 양식이 어떻게 표시되는지 보여주는 코드입니다. 폼은 폐쇄 완료되면

static class Program 
{ 
    // The main form is shown like this: 
    static void Main() 
    { 
     Application.Run(new MainForm()); 
    } 
} 

public class Class1 
{ 
    // _modalForm is the first form that is displayed that won't fully go away 
    // when it is closed. 
    ModalForm _modalForm; 
    BackgroundWorker _worker; 

    public Class1() 
    { 
     _modalForm = new ModalForm(); 
     _worker = new BackGroundWorker(); 
     _worker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted 
    } 

    public void Method1() 
    { 
     _worker.RunWorkerAsync(); 

     // The first form is shown. 
     _modalForm.ShowDialog(); 
    } 


    // This code runs in the UI thread.   
    void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     _modalForm.VisibleChanged += new EventHandler(_modalForm_visibleChanged); 
     _modalForm.Close(); 
    } 

    void _modalForm_visibleChanged(object sender, EventArgs e) 
    { 
     // When the message box is shown, the other form is still visible 
     // and remains so until I click OK. 
     MessageBox.Show("The other form was just closed."); 

     // Note: I originally tried to use the FormClosed event instead of 
     // VisibleChanged. Then I tried Deactivate, in attempt to use an event 
     // that occurred later thinking that might do the trick. VisibleChanged 
     // is the latest event that I found. 
     // 
    } 
+1

답변은 기본 양식을 어떻게 표시하는지에 달려 있다고 생각합니다. 마음에 들지 않는 행동을 보여주는 최소한의 코드를 게시 할 수 있습니까? – Karmastan

답변

5

에어로를 끈 상태에서 Windows XP 또는 Vista/Win7에서 코드를 실행하고 있다고 생각합니다. 양식을 닫으면 이 아닌 화면의 픽셀이 즉시 사라집니다. 윈도우 윈도우 매니저는 폼 윈도우가 파괴 된 것을 보았고 그 윈도우 아래에있는 다른 윈도우의 일부를 드러냈다. 공개 된 창 부분을 다시 칠할 필요가 있음을 알리기 위해 WM_PAINT 메시지를 전달합니다.

하나 이상의 창이 윈도우에서 활발하게 메시지 루프를 펌핑하지 않으면 제대로 작동하지 않습니다. WM_PAINT 메시지를 볼 수 없습니다. 그들은 다시 칠하지 않을 것이고 닫힌 폼의 픽셀은 화면에 남아있을 것입니다.

이 창이 응답하지 않는 이유를 확인하십시오. 다행히도 그것은 당신의 윈도우이고 디버거는 UI 쓰레드가하는 일을 보여 줄 수 있습니다. 무언가에 막히지 않거나 루프에 걸리지 않았는지 확인하십시오.


편집을 본 후 : 실제로 다른 종류의 대화가 차단되고 있습니다. MessageBox.Show() 호출은 모달이며 VisibleChanged 이벤트가 완료되지 않도록합니다. 그것은 폼의 닫는 것을 지연시킵니다.

Window Forms 응용 프로그램에서 진단을 받으려면 System.Diagnostics.Debug.WriteLine() 또는 Console.WriteLine()을 사용하십시오. 출력 창에 표시됩니다. 또는 단순히 디버거 중단 점을 사용하십시오.

+0

저는 실제로 Windows XP를 사용하고 있습니다. 내 질문에 일부 코드가 포함되도록 편집했습니다. 나는 UI 스레드가 블로킹하고 있다고 생각하지 않는다. 그리고 스레드가 "루프에 갇혀있다"는 것이 무엇을 의미하는지 완전히 이해하지는 못한다. 그러나 폼이 모달로 보여지고 있다는 사실은 아무 관계가 없다. 그것? – YWE

+2

@YWE : MessageBox.Show() 호출은 단순히 VisibleChanged 이벤트를 차단하여 정상적인 폼 종료가 완료되지 않도록합니다. WF 앱에서 디버깅을 위해 MessageBox를 사용하지 말고 Debug.WriteLine()을 사용하십시오. –

+0

@ Hans Passant : 아, Form이 완전히 사라지기 전에 VisibleChanged 이벤트가 완전히 끝나야합니다. 메시지 상자는 실제로 프로그램의 일부이며 디버깅 도구가 아닙니다.Dispose 이벤트를 사용하여 동일한 프로그램을 시도했지만 원하는대로 작동합니다. 감사. – YWE

2

Form.FormClosed 이벤트가 발생된다. 이 시점에서 모든 Form.FormClosing 이벤트 처리기가 실행되었으며 그 중 아무도 닫기를 취소하지 않았습니다.

Form.FormClosedForm.Closed (대체하지 않음)은 .NET 2.0 프레임 워크에서 사용됩니다.

관련 문제