私はBlobストレージ内の私のクラウドに格納されているPNGファイルを持っています。私はそれをダウンロードしてWPFのスクリーンにレンダリングします。WPF BitmapFrameと複数のスレッド
私はDispatcherとFreezingについて知っていますが、何も動作していません。私は「別のスレッドがそれを所有している」というエラーを受けています。ここで
は私が持っているものです。
var decoder = GetDecoder("http://address/image.png");
Dispatcher.Invoke(DispatcherPriority.Send, new Action<BitmapFrame>(SetImage), decoder.Frames[0]);
public void SetImage(BitmapFrame source)
{
var bitmapFrame = BitmapFrame.Create(source); //ERROR HERE!!!!!!!!
LazyImage.Source = bitmapFrame;
}
private BitmapDecoder GetDecoder(object uri)
{
var extension = System.IO.Path.GetExtension((string)uri);
BitmapDecoder decoder = null;
if (extension.ToLower() == ".png")
decoder = BitmapDecoder.Create(new Uri((string)uri, UriKind.Absolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
return decoder;
}
Iフレームを凍結しようとした場合、[0]私はこのフレームを凍結することができないという例外を取得します。また、BitmapDecoder.Create
によって返されたデコーダはではなく、PngBitmapDecoder
ではありませんが、私は実際に効果的にどのように使用するのか本当に知りませんLateBoundBitmapDecoder
です。
はおそらく、私は、デコーダの作成が、私はそれがUIスレッド上で起こっ避けたいということを意味同期動作だと思います。私のローカルPC上のファイル(http URLではなく)は、デコーダが 'PngBitmapDecoder'のため、正常に動作します。 – Mark
これはおそらく、スレッドでBitmapFrame.Create()を呼び出して、それが返すフレームを凍結する? – Lugoues
LateBoundBitmapDecoderから返されたフレームをフリーズすると、例外が発生しますが、ローカルURL(したがってPngBitmapDecoder)を使用するとフリーズすることができ、正常に動作します。 – Mark