2011-02-09 15 views
1

私は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です。

答えて

1

ディスパッチャでBitmapframeを作成するだけでなく、BitmapDecoderを作成する必要がある可能性がありますか?ディスパッチャでGetDecoderを呼び出そうとしましたか?

+0

はおそらく、私は、デコーダの作成が、私はそれがUIスレッド上で起こっ避けたいということを意味同期動作だと思います。私のローカルPC上のファイル(http URLではなく)は、デコーダが 'PngBitmapDecoder'のため、正常に動作します。 – Mark

+0

これはおそらく、スレッドでBitmapFrame.Create()を呼び出して、それが返すフレームを凍結する? – Lugoues

+0

LateBoundBitmapDecoderから返されたフレームをフリーズすると、例外が発生しますが、ローカルURL(したがってPngBitmapDecoder)を使用するとフリーズすることができ、正常に動作します。 – Mark

1

要約:結果をWriteableBitmapにラップしてみてください。

Long story, with code.

+0

私の場合、これは唯一の解決策でした。 BitmapFrameをTransformedBitmapにフィードする必要がありました。 BitmapFrameがライブラリによって提供されているので(BitmapFrameのDispatcherプロパティがnull)、BitmapFrameが作成されたスレッドを制御できませんでした。 CanFreezeプロパティを照会しても例外が発生しました。私は2つの選択肢がありました。私のソースコードの大規模な見直し、またはWriteableBitmapの使用です。どちらが私が選んだか推測する... – elgonzo

関連する問題