2012-10-08 5 views
1

DrawingContext.PushClip 및 그에 상응하는 Pop 메서드에 의존하는 렌더링 코드가 있습니다.WPF 푸시 및 팝

이제
protected override void OnRender(DrawingContext drawingContext) 
{ 
    drawingContext.PushClip(whatever); 
    OnRenderInternal(...); 
    drawingContext.Pop(); 
} 
  • , 이제 정말 나쁜 무언가가 OnRenderInternal 방법에서 발생하고 (호출되지 얻을 않습니다이 경우 Pop에서) 예외를 throw 가정하자. 이로 인해 전체 렌더링 프로세스 이 손상되거나 다른 작업을 수행하기 전에 드로잉 컨텍스트가 "안전한"상태로 되돌아갑니다 (다른 렌더링 가능 항목에 클리핑이 발생하지 않음)?

  • 기본적으로 항상은 렌더링 작업을 수행 할 때 드로잉 컨텍스트를 초기 상태로 되 돌리시겠습니까?

  • 이 간단한 경우 try-finally 문을 사용하여 문제를 피할 수 있지만 올바른 Push/Pop 스택을 유지하는 것을 잊으면 어떻게됩니까? 당신이 할 수있는

답변

2

나는 당신의 OnRender 모든 호출에 새로운 DrawingContext를 얻을 간단한 이유를 들어, 초기 상태로 DrawingContext를 되돌릴 필요는 일반적으로 없다 생각합니다. OnRender가 호출 될 때마다 전체 도면이 다시 만들어지고 DrawingContext를 벗어나는 상태는 중요하지 않습니다.

그러나 예외가 있습니다. 파생 된 UIElement는 OnRender를 재정의 할 수 있으며 자체 렌더링 코드를 수행하기 전에 먼저 base.OnRender()를 호출 할 수 있습니다. 이 시나리오에서 파생 된 UIElement는 기본 클래스의 OnRender 메서드에서 "손상된"DrawingContext를 가져옵니다.

그래서 UIElement를 파생시킬 수 없다면 DrawingContext를 정의되지 않은 "손상된"상태로 두지 않는 것이 좋습니다.

1

:

protected override void OnRender(DrawingContext drawingContext) 
{ 
    try 
    { 
     drawingContext.PushClip(whatever); 
     OnRenderInternal(...);   
    } 
    finally 
    { 
     drawingContext.Pop(); 
    } 
} 
+0

고맙습니다. 그러나 나는 정말로 '팝'을 부르는 것을 잊었을 때 나는 정말로 관심이있다. 그리고 나는 그것이 얼마나 나쁜가를 알고 싶다. (나의 질문에서 마지막 문장을 보라). –

+0

음, * 무엇이든 * 렌더링 할 수 없으며 매번 오류가 발생하면 튀어 나올 때까지 아무것도 렌더링하지 않습니다. –

관련 문제