WPF Push和Pop

时间:2012-10-08 13:31:49

标签: c# .net wpf user-interface render

我有一些渲染代码,它依赖于DrawingContext.PushClip和相应的Pop方法。

protected override void OnRender(DrawingContext drawingContext)
{
    drawingContext.PushClip(whatever);
    OnRenderInternal(...);
    drawingContext.Pop();
}
  • 现在,让我们假设在OnRenderInternal方法中发生了一些非常糟糕的事情,它会引发异常(在这种情况下Pop永远不会被调用)。这是否会破坏整个渲染过程,或者绘图上下文会在执行其他操作之前将其自身恢复为某种“安全”状态(并且其他可渲染项目不会发生剪切)?

  • 基本上,我是否总是关心在执行渲染操作时将绘图上下文恢复为初始状态?

  • 我意识到在这个简单的情况下我可以通过使用try-finally语句来避免麻烦,但是如果我忘记保留正确的Push / Pop堆栈会发生什么?

    < / LI>

2 个答案:

答案 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();
    }
}