【问题标题】:WPF Push and PopWPF 推送和弹出
【发布时间】:2012-09-28 18:26:35
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为通常不需要将 DrawingContext 恢复到其初始状态,原因很简单,每次调用 OnRender 时都会获得一个新的 DrawingContext。每次调用 OnRender 时都会重新创建整个绘图,无论您离开 DrawingContext 处于哪个状态。

    但是有一个例外。派生的 UIElement 也可以覆盖 OnRender,并且可以在执行自己的呈现代码之前首先调用 base.OnRender()。在这种情况下,派生的 UIElement 将从基类的 OnRender 方法中获得“损坏的”DrawingContext。

    因此,除非您可以确保您的 UIElement 无法派生,否则最好不要让 DrawingContext 处于未定义的“损坏”状态。

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      【讨论】:

      • 谢谢。但是,当我忘记打电话给Pop 时,我真的很感兴趣,我想知道这有多糟糕(请参阅我问题的最后一句话)。
      • 好吧,如果 whatever 无法渲染并且每次都抛出错误,那么在弹出之前不会再次渲染。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      相关资源
      最近更新 更多