2010-05-06 3 views
0

는 다음과 같은 시나리오를 상상해 :양식이 아래에있을 때 콜백 중에 OnPaint 이벤트가 발생합니까?

this.SetStyle(ControlStyles.UserPaint, true); //this doesn’t change anything 

… 

void OpenSomeForm() 
{ 
    SomeForm sf = new SomeForm(); 
    sf.SomeEvent += new … (SomeEventOcurred); 
    sf.ShowDialog(); 
} 

private void SomeEventOcurred(…) 
{ 
    OnePanelInThisForm.Invalidate(); 
} 

private void OnePanelInThisForm_Paint(object sender, PaintEventArgs e) 
{ 
    DoSomeDrawing(e.Graphics); 
} 

이제 OnePanelInThisForm 올바르게 때 폼이로드를 그립니다. 그러나 SomeEventOcurred가 "SomeForm"에서 시작되면 페인트 이벤트는 이 아닌입니다. 양식을 닫았다가 다시 열면 올바르게 다시 칠합니다. 실행하는 폼에 단추를 추가하는 경우 : OnePanelInThisForm.Invalidate(); 패널이 올바르게 다시 칠해집니다.

무엇이 누락 되었습니까?

업데이트 : 명확함. (우리가 처음에 이것을하지 않는 이유는 무엇입니까?)

나는 FORM_A가 있습니다. 이 FORM_A에는 Paint 이벤트를 대체하는 Panel이 있습니다. 그것은 표준 WinForm입니다. 페인트에서 원을 그립니다. 이 작동합니다. FORM_B에는 FORM_B가 열리는 버튼이 있습니다. 하지만 그렇게하기 전에 FORM_B의 Custom 이벤트 인 SomeEvent를 구독합니다. (위의 샘플 참조). 그래서 FORM_B는 "SomeEvent"에 대해 FORM_A에게 알릴 수 있습니다.

이제 FORM_B도 일반적인 WinForm입니다. 그리고 정상적인 버튼이 있습니다. 해당 단추의 Click 이벤트에서 FORM_C가 열립니다. 또한 FORM_C에는 SomeEvent라는 이벤트가 있으며 분명히 FORM_B는 해당 이벤트를 구독합니다. 예전처럼. 아이디어는 FORM_C에 해당 이벤트를 트리거하는 단추가있어 관심있는 구독자에게 알리는 것입니다. 이 경우 FORM_C가 이벤트를 시작하면 FORM_B가 등록되고 관심이 있습니다.

FORM_B가 콜백을 받으면 이벤트가 시작된 이해 당사자 (이 경우 FORM A)에게 알립니다.

양식 C가 여전히 최상위 양식 인 경우에도 호출 스택은 첫 번째 이벤트의 콜백으로 정의 된 메소드로 FormA로 돌아갑니다.

이 코드는 실행됩니다. 그것이하는 일은 정말로 somePanel.Invalidate() (또는 Refresh(), 같은 결과)입니다.

해당 패널의 PAINT 메소드에있는 중단 점은 코드가 호출되지 않음을 나타냅니다. 무효화 되더라도 Paint 이벤트는 발생하지 않습니다. 나는 폼 (그리고 패널)이 실제로 FORMB과 FORMC (아직 열림)에 의해 덮여 있기 때문에 일어난다 고 가정한다.

그게 전부입니다. 양식 C를 닫고 양식 B를 닫으면 양식 A는 여전히 페인트 이벤트를 발생시키지 않습니다. 양식 활성화시 패널을 무효화하려고했지만 그럴 수 없습니다.

양식을 닫고 다시 열면 그림이 올바른 것입니다.

희망 사항은이 점을 분명히합니다.

매우 간단하므로 FORM> B> C (화재 이벤트) -> B -> A -> Invalidate() 코드가별로 없습니다.

답변

1

Invalidate() 대신 Refresh()를 사용해보십시오. 어쨌든 그것은 나를 위해 더 일관되게 일하는 것 같습니다.

관련 문제