5

私のシナリオでは、バックグラウンド タスクでレンダリングする前に、変更されていない BitmapCacheBrush をフリーズしたいと考えています。残念ながら、「この Freezable は凍結できません」というエラーが表示されます。フリーズ可能なオブジェクトではなくフリーズする回避策やハッキーな方法はありますか? この目標を達成するために、リフレクションを介して適切なプロパティを設定することは可能でしょうか? よろしくお願いします。

編集:(要求された私のサンプルコード)

 public static class ext
{
    public static async Task<BitmapSource> RenderAsync(this Visual visual)
    {
        var bounds = VisualTreeHelper.GetDescendantBounds(visual);

        var bitmapCacheBrush = new BitmapCacheBrush(visual);
        bitmapCacheBrush.BitmapCache = new BitmapCache();

        // We need to disconnect the visual here to make the freezable freezable :). Of course this will make our rendering blank
        //bitmapCacheBrush.Target = null;

        bitmapCacheBrush.Freeze();

        var bitmapSource = await Task.Run(() =>
        {
            var renderBitmap = new RenderTargetBitmap((int)bounds.Width,
                                                         (int)bounds.Height, 96, 96, PixelFormats.Pbgra32);

            var dVisual = new DrawingVisual();
            using (DrawingContext context = dVisual.RenderOpen())
            {

                context.DrawRectangle(bitmapCacheBrush,
                                      null,
                                      new Rect(new Point(), new Size(bounds.Width, bounds.Height)));
            }

            renderBitmap.Render(dVisual);
            renderBitmap.Freeze();
            return renderBitmap;
        });

        return bitmapSource;
    }

}
4

1 に答える 1