2011-12-05 4 views
0

私は、uriが見つからないときに私のアプリケーションがバグを表示しているので、webclient checkがExtendedImageによって処理される前にストリームをダウンロードしようとしています。ImageTools and Webclient

私の解決策は、最初にイメージをロードしてから、Webクライアントの結果を拡張イメージに読み込むことです。

これは私がやろうとしていることです。

WebClient wc = new WebClient(); 
wc.OpenReadAsync(Uri); 

wc.OpenReadCompleted += delegate(object Sender, OpenReadCompletedEventArgs e){ 
     Logo = new BitmapImage(); 
     ExtendedImage hExtendedImage = new ExtendedImage(); 

     try 
     { 
       hExtendedImage.SetSource(e.Result); 
       Logo.SetSource(hExtendedImage.ToStream()); 
     } 
     catch (WebException) 
     { 

     } 
}; 

が、今、私はこの行のhExtendedImageからのエラー

Logo.SetSource(hExtendedImage.ToStream()); 

私は明らかに間違っhExtendedImageにe.Resultから画像をロードしています「イメージがロードされていません」取得しています。

+0

あなたはe.Error == nullをチェック一部を除外しましたか? – bperreault

答えて

0
var client = new WebClient(); 

// Always define event handlers, 
// BEFORE calling any method that could invoke them. 
client.OpenReadCompleted += (s1, e1) 
{ 
    Logo = new BitmapImage(); 

    var extendedImage = new ExtendedImage(); 
    extendedImage.OnLoadingCompleted += (s2, e2) 
    { 
     // Invoke the dispatcher, so we're sure it's set on the UI thread. 
     Dispatcher.BeginInvoke(new Action 
     (
      () => Logo.SetSource(extendedImage.ToStream())) 
     ); 
    }; 
    extendedImage.SetSource(e1.Result); 
}; 

client.OpenReadAsync(Uri); 
+0

は '(s1、e2)'です。デリゲートの省略形ですか? *編集、申し訳ありませんラムダ:) –

0

残念ながら、SetSourceはansycです。ロゴソースを設定するには、hExtendedImageのLoadingCompletedイベントを使用します。 注意: LoadingCompletedコールバックはUIスレッドにありません! ImageのようなUIコントロールを変更する場合は、ディスパッチャを呼び出す必要があります。

CodePlexの上ExtendedBitmapソースから:

public void SetSource(Stream stream) 
     { 
      Contract.Requires<ArgumentNullException>(stream != null, "Stream cannot be null."); 

      if (_uriSource == null) 
      { 
       LoadAsync(stream); 
      } 
     }