2016年06月19日
川俣晶の縁側ソフトウェア技術雑記 total 2146 count

UWPでRenderTargetBitmapが非同期で動作する罠

Written By: 川俣 晶連絡先

「ちょっとメモ」

「なんだい?」

「UWPにはRenderTargetBitmapというクラスがあってコントロールをレンダリングしたビットマップを作成してくれる」

「うん」

「ところが以下のように使うとpictureの中身をレンダリングしてくれない」

ResizedImage.Source = picture;

RenderTargetBitmap RenderImage = new RenderTargetBitmap();

await RenderImage.RenderAsync(ResizedImage);

「なぜ?」

「ResizedImage.Source = picture;を実行しても、ソースが指定されるだけで即座に画面に反映されるわけではないのだ。そして、RenderAsyncメソッドは今現在画面に見えているものをビットマップにレンダリングする」

「つまり、非同期で動作するから完了を待たずにレンダリングしても意味が無いわけだね」

「そうだ」

「じゃあさ。レンダリングの終了イベントを受け取ってから実行すればいいじゃないか」

「実は、ロード終了を示すイベントまでは把握できたが、既に読み込み済みの画像オブジェクトをソースに指定する場合はイベントが起きないようだ」

「じゃあ、どれを使えばいいの?」

「分からない。分からないので、取りあえず問題をメモだ」

暫定解決策 §

「暫定的には以下の箇所に時間待ちを入れると動く」

「どれぐらい?」

「100ms待たせれば動いたが、それははたして全てのマシンで有効な値か分からない」

「じゃあどう解決した」

「取りあえずボタン押すのを待たせたよ」

ResizedImage.Source = picture;

(時間待ち)

RenderTargetBitmap RenderImage = new RenderTargetBitmap();

await RenderImage.RenderAsync(ResizedImage);