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;
}
}
:
は私がGUIを更新する必要があります更新機能とこのようにそれを呼び出すを作りましたUIを更新するにはINotifyPropertyChangedを使用してください – Jason
私はそれを試みましたが、うまくいきませんでした。あなたは私の例を教えてもらえますか?さらに私は、戻るボタンを押してビューを再度開くと、ビューが更新されることに気付きました。 –