1

UI コントロールを作成し、それを画像にレンダリングして画像ライブラリに保存するために、N (関係ありません) 分ごとに実行する必要があるバックグラウンド タスクがあります。ここにいくつかのコードを書きました:

public async void Run(IBackgroundTaskInstance taskInstance)
    {
        var def = taskInstance.GetDeferral();

        // creating control
        var canvas = new Canvas
        {
            Height = 100,
            Width = 100
        };

        canvas.Children.Add(new TextBlock { Text = "Hello world" });

        var size = new Size(100, 100);

        canvas.Measure(size);
        canvas.UpdateLayout();
        canvas.Arrange(new Rect(0, 0, size.Width, size.Height));

        // rendering
        var bitmap = new RenderTargetBitmap();
        await bitmap.RenderAsync(canvas);

        // saving as jpg
        var file = await KnownFolders.PicturesLibrary.CreateFileAsync("sample.jpg");
        using (var stream = await file.OpenStreamForWriteAsync())
        {
            var pixelBuffer = await bitmap.GetPixelsAsync();
            var logicalDpi = DisplayInformation.GetForCurrentView().LogicalDpi;

            // convert stream to IRandomAccessStream
            var randomAccessStream = stream.AsRandomAccessStream();

            // encoding & finish saving
            var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, randomAccessStream);
            encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)bitmap.PixelWidth,
                                 (uint)bitmap.PixelHeight, logicalDpi, logicalDpi, pixelBuffer.ToArray());

            await encoder.FlushAsync();
        }

        def.Complete();
    }

しかし、ここで2つの問題があります。

  1. バックグラウンドで UI 要素を作成することはできません。UI スレッドでのみ作成できます。バックグラウンドタスクから作成する方法はありますか? ディスパッチャーを使用する多くの方法を試しましたが、これはうまくいきませんでした...

  2. この記事この質問に従って、現在のページのビジュアル ツリーにないコントロールから画像をレンダリングすることはできません。このことのハッキングの可能性はありますか?

助けてくれてありがとう

4

1 に答える 1

0

MSDN フォーラムで関連する質問をしています。私の再現コードが役立つかもしれません。再現コードでは、CoreApplicationView をバックグラウンド UI スレッドとして作成し、RenderAsync を呼び出してターゲット UIElement の画像を生成します。この再現コードには問題がありますが、問題なく動作する可能性があります。

私の質問はここにあります

于 2014-03-21T08:35:44.263 に答える