2012-03-19 123 views
2

在我的WP7應用程序中,我從網絡上收集了一些簡單的文本數據。在wp7中加載網頁內容時顯示進度條

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; 
      }); 
    } 
} 

我增加了一個不確定的進度欄我的佈局。現在我想在我的應用程序從網絡加載數據時顯示它。

我該怎麼做?有任何想法嗎?

+0

你使用MVVM模式嗎? – MarcinJuraszek 2012-03-19 09:31:45

回答

2

最簡單的方法是,在進行調用(頂級代碼提取)並調用時,將進度條的可視性更改爲可見.Visibility =完成時摺疊(在第二個示例中,在你的BeginInvoke()塊內)。

1

正如Shahar所說,當您的回撥開始時,您需要將進度欄的可見屬性設置爲true,當回撥結束時將false設置爲false。您也可能需要修改回電以獲取您所取得的進展。

您可以從WebResponse.ContentLength屬性(在您的示例中爲response.ContentLength)獲取要下載的數據總量。然後,您不必調用ReadToEnd,而是以塊的形式讀取數據流,以便在下載完成之前更新下載的數量。

注意:ContentLength僅在服務器發送Content-Length HTTP標頭時有效。出於性能原因,一些服務器在決定響應結束之前會開始發送響應。在這種情況下,他們不知道在發送HTTP頭時響應會有多大,因此無法設置ContentLength。在這種情況下,ContentLength設置爲-1,您將無法計算persentage complete。

最後,如果您正在下載大文件,最好使用BackgroundTransferRequest對象,因爲即使您的應用程序已被禁用或邏輯刪除,此對象仍可繼續工作。儘管如此,這隻在芒果(7.1)版本中可用。