2012-10-08 24 views
1

我有一些渲染代碼,它依賴於DrawingContext.PushClip和相應的Pop方法。WPF Push and Pop

protected override void OnRender(DrawingContext drawingContext) 
{ 
    drawingContext.PushClip(whatever); 
    OnRenderInternal(...); 
    drawingContext.Pop(); 
} 
  • 現在,讓我們假設真壞事情發生在OnRenderInternal方法,它拋出一個異常(在這種情況下Pop將永遠不會被調用)。這是否會破壞整個渲染過程或者在執行其他操作(並且其他可渲染項目不會發生裁剪)之前,繪圖上下文將自己恢復到某個「安全」狀態?

  • 基本上,我是否應該總是關心在執行渲染操作時將繪圖上下文恢復到其初始狀態?

  • 我意識到,在這種簡單的情況下,我可以通過使用try-finally聲明來避免麻煩,但如果我忘記保留正確的Push/Pop堆棧會發生什麼?

回答

2

我認爲通常沒有想要恢復的DrawingContext到初始狀態,原因很簡單,那你在每次調用OnRender將一個新的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

謝謝。不過,我真的很感興趣的是,當我忘記調用「Pop」時,我想知道它有多糟糕(請參見我的問題中的最後一句)。 –

+0

好吧,如果*任何*無法呈現並且每次都拋出一個錯誤,那麼在彈出之前什麼也不會呈現。 –