我有一些渲染代码,它依赖于DrawingContext.PushClip
和相应的Pop
方法。
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext.PushClip(whatever);
OnRenderInternal(...);
drawingContext.Pop();
}
现在,让我们假设在OnRenderInternal
方法中发生了一些非常糟糕的事情,它会引发异常(在这种情况下Pop
永远不会被调用)。这是否会破坏整个渲染过程,或者绘图上下文会在执行其他操作之前将其自身恢复为某种“安全”状态(并且其他可渲染项目不会发生剪切)?
基本上,我是否总是关心在执行渲染操作时将绘图上下文恢复为初始状态?
我意识到在这个简单的情况下我可以通过使用try-finally
语句来避免麻烦,但是如果我忘记保留正确的Push / Pop
堆栈会发生什么?
答案 0 :(得分:2)
我认为通常不需要将DrawingContext恢复到其初始状态,原因很简单,就是每次调用OnRender时都会获得一个新的DrawingContext。每次调用OnRender时都会重新创建整个绘图,并且在离开DrawingContext的状态下无关紧要。
但有一个例外。派生的UIElement也可以覆盖OnRender,并且可以在执行自己的呈现代码之前首先调用base.OnRender()。在这种情况下,派生的UIElement将从基类'OnRender方法中获取“损坏的”DrawingContext。
因此,除非您确定无法从中派生出UIElement,否则最好不要将DrawingContext置于未定义的“损坏”状态。
答案 1 :(得分:1)
你可以这样做:
protected override void OnRender(DrawingContext drawingContext)
{
try
{
drawingContext.PushClip(whatever);
OnRenderInternal(...);
}
finally
{
drawingContext.Pop();
}
}