2013-12-19 4 views
2

이벤트에 의해 트리거 될 때 2 초 동안 표시되고 자동으로 닫히는 Windows 양식을 만들려고합니다.C에서 팝업 양식 만들기

몇 가지 옵션을 시도했습니다. 폼이로드가 양식에있는 라벨이나 이미지를로드하지 않는 경우

 this.aletPopup.StartPosition = FormStartPosition.CenterScreen; 
     this.aletPopup.Show(); 
     Thread.Sleep(2000); 
     this.aletPopup.Close(); 

이, 나는 그러나, 원하는 작업을 예비 적 : 이것은 내 현재 코드입니다. 대신 이미지와 레이블이 투명 해지는 영역입니다. 원하는 출력은 다음과 같습니다. enter image description here

또한 그래픽을 표시하는 this.aletPopup.ShowDialog();을 사용해 보았습니다. 그러나이 방법을 사용하면 양식이 자동으로 닫히지 않습니다.

편집 : Michael Perrenoud의 솔루션을 사용하려고합니다. 그러나 양식을 닫을 수 없습니다. 나는 타이머가 2000ms 간격으로 설정되어있다. OnShown을 올바르게 재정의합니까?

public AlertPopForm() 
    { 
     InitializeComponent(); 

    } 

    private void closingTimer_Tick(object sender, EventArgs e) 
    { 
     closingTimer.Enabled = false; 
     this.Close(); 
    } 

    private void AlertPopForm_OnShown(object sender, System.EventArgs e) 
    { 
     closingTimer.Enabled = true; 
     closingTimer.Start(); 
    } 
+0

'OnShown'을 전혀 무시하지 않습니다. 'protected override void OnShown (EventArgs e) {base.OnShown (e);}와 같이 보일 것입니다./* Your code here * /}' –

답변

6

대신, 어떻게 ShowDialog을 활용하고 대화 폼에 Timer를 사용하는 방법에 대한. Tick 이벤트가 Timer 인 경우 양식을 닫습니다. 일부 유연성을 원한다면

this.aletPopup.StartPosition = FormStartPosition.CenterScreen; 
this.aletPopup.ShowDialog(); 

당신은 대화 형식의 .ctor에 간격을 전달할 수 있습니다.

실제로 TimerOnShown 재정의를 활용하여 양식을 실제로 사용자에게 보여줄 필요가 있다는 점에 유의해야합니다.

+0

나는 (내 게시물에서 언급 했어야하는) 이것을 시도했지만 양식은 결코 열리지 않을 것이다. –

+0

@AdamJakiela, 그건 정확하지 않습니다. [OnShown] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.onshown (v = vs.110) .aspx) 무시를 사용하면 ' 타이머가 시작됩니다. 양식이 실제로 표시 될 때까지는 시작되지 않습니다. –

+0

타이머를 사용하려고하는데 응용 프로그램이 닫히지 않습니다. 위 코드를 게시했습니다. –

1

이유는 Message Loop에있을 수 있습니다. Thread.Sleep으로 스레드를 차단하면 Message 루프도 차단됩니다.

이 같이 할 수 있습니다 :

this.aletPopup.StartPosition = FormStartPosition.CenterScreen; 
this.aletPopup.Show(); 
for(var i = 0; i<= 200; i++) 
{ 
    Thread.Sleep(10); 
    Application.DoEvents(); 
} 
this.aletPopup.Close(); 

DoEvents는 그 시간 동안 메시지 큐에서 메시지를 처리합니다.

+1

다른 사람이 왜 투표에 실패했는지 설명 할 수 있습니까? 나를 위해 일하는 것 같았다. –

+1

Application.DoEvents의 사용은 여기에서 끔찍한 생각이며 그것이하도록 설계된 것의 전체적인 남용입니다. 미묘한 버그/경쟁 조건을 도입하고 매우 열악한 프로그래밍 관행을지지합니다. 또한, Thread.Sleep의 부정확성과 함께 처리되는 메시지를 기다리는 데 소요되는 시간을 세지 않고 있기 때문에, 시간이 지나치게 길어질 가능성이 매우 높습니다. 대부분의 컴퓨터에서'Sleep'은 최소 16ms의 정밀도를 가지므로 적어도 3 초를 기다릴 것입니다. – Servy

+0

이것은 분명히 질문에 대답하고 있습니다 ...하지만 해결책은 나쁩니다. – Andrew

-1

새로 고침하여 양식을 다시 그려 보셨습니까?

this.aletPopup.StartPosition = FormStartPosition.CenterScreen; 
    this.aletPopup.Show(); 

    this.alertPopup.Refresh(); 


    Thread.Sleep(2000); 
    this.aletPopup.Close(); 
+0

이렇게하면 전체 응용 프로그램 UI가 2 초 동안 고정되어 응답하지 않게됩니다. – Servy

1

Thread.Sleep으로 전화를 걸면 UI 스레드를 차단하여 UI 이벤트 처리를 차단합니다.

실제로 주 스레드를 차단하지 않고 Close을 2 초 후에 호출해야합니다. 같은 Task.Delay 같은 Timer, 또는 무언가를 사용하는 것과이 일을 가지 방법 중 하나입니다 : 이런 일이

aletPopup.StartPosition = FormStartPosition.CenterScreen; 
aletPopup.Show(); 
Task.Delay(TimeSpan.FromSeconds(2)) 
    .ContinueWith(t => aletPopup.Close(), 
    TaskScheduler.FromCurrentSynchronizationContext()); 
+0

+1 내 친구, 나는 'Task.Delay' 접근법을 좋아합니다! –

0

이유는, 양식을 그리는 스레드를 중단하는 것입니다. 따라서 폼에 표시 할 시간이 있지만 그려 질 때 스레드가 중지됩니다.

쉽게 수정할 수 있습니다 ....

는 다음 핸들러와 Load 이벤트에 대한 팝업에 이벤트 핸들러를 추가

private async void handleLoad(Object sender, EventArgs args) 
{ 
    await Task.Delay(2000); 
    Close(); 
} 

비는 Show()을 사용하기 때문에 , 사용자가 항상이 팝업 주위에 클릭 수 있습니다. 이것이 바람직하지 않은 경우 ShowDialog()을 대신 사용하십시오.