1

DrawingContext.PushClip対応するPopメソッドに依存するレンダリングコードがいくつかあります。

protected override void OnRender(DrawingContext drawingContext)
{
    drawingContext.PushClip(whatever);
    OnRenderInternal(...);
    drawingContext.Pop();
}
  • ここで、OnRenderInternalメソッドで非常に悪いことが発生し、例外がスローされたとします (この場合Pop、呼び出されることはありません)。これにより、レンダリング プロセス全体が中断されますか?または、他の操作を実行する前に、描画コンテキストが「安全な」状態に戻ります (他のレンダリング可能なアイテムに対してクリッピングは発生しません)。

  • 基本的に、レンダリング操作を実行するときに、描画コンテキストを初期状態に戻すことを常に気にする必要がありますか?

  • この単純なケースでは、ステートメントを使用することで問題を回避できることはわかっていますが、正しいスタックtry-finallyを保持するのを忘れるとどうなるでしょうか?Push / Pop

4

2 に答える 2

2

OnRender を呼び出すたびに新しい DrawingContext を取得するという単純な理由から、通常は DrawingContext を初期状態に戻す必要はないと思います。OnRender が呼び出されるたびに描画全体が再作成され、DrawingContext を離れる状態は関係ありません。

ただし、例外があります。派生した UIElement は OnRender をオーバーライドすることもでき、独自のレンダリング コードを実行する前に最初に base.OnRender() を呼び出すことができます。このシナリオでは、派生した UIElement は、基本クラスの OnRender メソッドから "破損した" DrawingContext を取得します。

したがって、UIElement が派生できないことを確認できない限り、DrawingContext を未定義の「破損した」状態のままにしないことをお勧めします。

于 2012-10-12T22:50:52.660 に答える
1

あなたがすることができます:

protected override void OnRender(DrawingContext drawingContext)
{
    try
    {
        drawingContext.PushClip(whatever);
        OnRenderInternal(...);        
    }
    finally
    {
        drawingContext.Pop();
    }
}
于 2012-10-08T13:42:38.043 に答える