2017-11-17 21 views
0

私はアイテムのタイトルを表示し、進捗状況をパーセンテージで表示したいと思うListView(Xamarin Forms MasterDetails-Templateのような)を持っています。ListViewのダウンロード進捗状況Xamarinフォーム

URLからデータをダウンロードするクラスを作成しました。 このクラスでは、WebClientを使用してファイルをダウンロードし、downloadProgress-EventHandlerを使用してグローバル変数を変更して、進捗をパーセンテージで取得します。

進捗状況をパーセンテージで表示するにはどうすればよいですか?

おかげ

public class DownloadHelper 
{ 
    string url; 
    string saveToPath; 
    string filename; 

    private string downloadError = ""; 
    private int downloadProgress = -1; 
    private long totalBytesToReceive = -1; 
    private long bytesReceived = -1; 
    private long bytesThatRest = -1; 
    private bool downloadfinished = false; 

    public string DownloadError { get => downloadError;} 
    public int DownloadProgress { get => downloadProgress;} 
    public long TotalBytesToReceive { get => totalBytesToReceive;} 
    public long BytesReceived { get => bytesReceived;} 
    public long BytesThatRest { get => bytesThatRest;} 
    public bool Downloadfinished { get => downloadfinished;} 

    public DownloadHelper(string url, string saveToPath, string filename) 
    { 
     ///Prepare a download. 
     this.url = url; 
     this.saveToPath = saveToPath; 
     this.filename = filename; 
    } 

    async public void DownloadZip() 
    { 
     ///Download an Unzip a Zip-File in the saveToDirektory. 
     var filenameAndPath = Path.Combine(saveToPath, filename); 
     string foldernameAndPath = saveToPath.Replace(".zip", ""); 

     if (Directory.Exists(foldernameAndPath)) 
     { 
      Directory.Delete(foldernameAndPath, true); 
     } 
     Directory.CreateDirectory(foldernameAndPath); 

     var webClient = new WebClient(); 
     var urlen = new Uri(url); 
     await webClient.DownloadFileTaskAsync(urlen, filenameAndPath); 

     webClient.DownloadProgressChanged += (s, e) => 
     { 
      downloadProgress = e.ProgressPercentage; 
      totalBytesToReceive = e.TotalBytesToReceive; 
      bytesReceived = e.BytesReceived; 
      bytesThatRest = TotalBytesToReceive - BytesReceived; 
     }; 

     webClient.DownloadFileCompleted += (s, e) => 
     { 
      downloadfinished = true; 

      if (downloadProgress != 100) 
      { 
       downloadError = e.Error.Message.ToString(); 
      } 
      else 
      { 
       //Unzip downloaded Zipfile 
       ZipFile.ExtractToDirectory(filenameAndPath, foldernameAndPath); 

       //Delete unused Zip-File 
       File.Delete(filenameAndPath); 
      } 
     }; 
    } 
} 

public partial class DownloadedView : ContentPage, INotifyPropertyChanged 
{ 

    ItemsViewModel viewModel; 
    public DownloadedView(List<Item> items) 
    { 
     InitializeComponent(); 
     BindingContext = viewModel = new ItemsViewModel(items); 
    } 

    void Handle_ItemTapped(object sender, ItemTappedEventArgs e) 
    { 
     var item = (Item)((ListView)sender).SelectedItem; 
     string selectedItemName = item.Text; 

     switch (selectedItemName) 
     { 
      case "download1": 
       string downloadAddress = ""; 
       string destinationFolder = ""; 
       string filename = ""; 
       break; 

      case "download2": 
       string downloadAddress = ""; 
       string destinationFolder = ""; 
       string filename = ""; 
       break; 

      case "download3": 
       string downloadAddress = ""; 
       string destinationFolder = ""; 
       string filename = ""; 
       break; 
     } 

     DownloadHelper dh = download(downloadAddress, destinationFolder, filename); 

     //UPDATE DOWNLOAD PROGRESS HERE. 
     //WITH: dh.DownloadProgress 

     //Deselect Item 
     ((ListView)sender).SelectedItem = null; 
    } 

    DownloadHelper download(string downloadAddress, string destinationFolder, string filename) 
    { 
     DownloadHelper dh = new DownloadHelper(downloadAddress, destinationFolder, filename); 

     dh.DownloadZip(); 
     return dh; 
    } 
} 
+0

は私がGUIを更新する必要があります更新機能

void UpdateGUI(Item item, string newItemText){ item.Description = newItemText; viewModel.DataStore.UpdateItemAsync(item); viewModel.LoadItemsCommand.Execute(null);} 

とこのようにそれを呼び出すを作りましたUIを更新するにはINotifyPropertyChangedを使用してください – Jason

+0

私はそれを試みましたが、うまくいきませんでした。あなたは私の例を教えてもらえますか?さらに私は、戻るボタンを押してビューを再度開くと、ビューが更新されることに気付きました。 –

答えて

0

は今、私はそれを解決しました。 MainThreadのビューモデルを更新する必要がありました(GUIが実行されているため)。そしてちょうどその更新、データソース内の各項目はPerecentComplete性質を持っている場合

Device.BeginInvokeOnMainThread(() => UpdateGUI(item, "newItemText...")); 
関連する問題