2012-03-19 31 views
2

私のWP7アプリケーションでは、Webから簡単なテキストデータを取得します。wp7でWebコンテンツをロード中に進行状況バーを表示

string url = "home url"; 

var request = HttpWebRequest.Create(url); 

var result = (IAsyncResult)request.BeginGetResponse(ResponseCallback, request); 

そして、これは私がデータに

private void ResponseCallback(IAsyncResult result) 
{ 
    var request = (HttpWebRequest)result.AsyncState; 
    var response = request.EndGetResponse(result); 

    using (var stream = response.GetResponseStream()) 
    using (var reader = new StreamReader(stream)) 
    { 
     var contents = reader.ReadToEnd(); 

     Dispatcher.BeginInvoke(()=> 
      { 
       someLabelValue.Text = contents; 
      }); 
    } 
} 

を消費する方法である私は私のレイアウトに不確定進捗バーを追加しました。今私は、アプリケーションがWebからデータを読み込んでいるときに表示したいと思います。

どうすればいいですか?何か案は?

+0

MVVMパターンを使用していますか? – MarcinJuraszek

答えて

2

最も簡単な方法は、あなたがコール(トップコード抽出)とコール時に進行状況バーの.VisiblilityをVisibleに変更し、終了時に.Visibility = Collapsedを呼び出すことです(2番目のサンプルでは、あなたのBeginInvoke()ブロックの中で)。

1

Shaharは、コールバックが開始されたときにプログレスバーの表示プロパティをtrueに設定し、終了時にfalseを設定する必要があると述べています。また、あなたが行った進歩を得るためにコールバックを修正する必要があります。

ダウンロードするデータの総量は、WebResponse.ContentLengthプロパティ(例ではresponse.ContentLength)から取得できます。 ReadToEndを呼び出すのではなく、ダウンロードが完了する前にダウンロードされた量を更新できるように、ストリームをチャンクで読み込みます。

注:ContentLengthは、サーバーがContent-Length HTTPヘッダーを送信する場合にのみ機能します。パフォーマンス上の理由から、一部のサーバーは、応答の終わりを決定する前に応答を送信し始めます。この例では、HTTPヘッダーを送信してContentLengthを設定できない場合のレスポンスの大きさはわかりません。この場合、ContentLengthは-1に設定され、完全なpersentageを計算することはできません。

最後に大きなファイルをダウンロードしている場合は、アプリケーションが非アクティブ化またはトゥーンブリンクされていても引き続き機能するため、BackgroundTransferRequestオブジェクトを使用する方がよい場合があります。しかしこれはマンゴー(7.1)リリースでのみ利用可能です。

関連する問題