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つの問題があります。
バックグラウンドで UI 要素を作成することはできません。UI スレッドでのみ作成できます。バックグラウンドタスクから作成する方法はありますか? ディスパッチャーを使用する多くの方法を試しましたが、これはうまくいきませんでした...
この記事とこの質問に従って、現在のページのビジュアル ツリーにないコントロールから画像をレンダリングすることはできません。このことのハッキングの可能性はありますか?
助けてくれてありがとう