2015-06-02 88 views
-1

我的應用程序的一部分用於從預定義文件夾加載圖像。此時加載圖像需要更多時間。現在我需要一個進度條,可以讓我告訴加載進度。但我不知道如何在加載圖像時專門使用它。在C#中使用進度欄從文件夾加載圖像?

該函數通過將圖像導入名爲ImageList和Listview的控件來工作。 imageList將填充列表視圖。我認爲,這些控件是延遲的主要日常工作來顯示圖像:

this.lstView_un.View = View.LargeIcon; 
       lstView_un.LargeImageList = this.imageList1; 
       lstView_un.Items.Clear(); 
       for (int j = 0; j < this.imageList1.Images.Count; j++) 
       { 
        ListViewItem item = new ListViewItem(); 
        item.ImageIndex = j; 
        item.Text = imageList1.Images.Keys[j].ToString(); 
        this.lstView_un.Items.Add(item); 
       } 

見婁代碼查看詳細

任何一個可以幫助我嗎? 在此先感謝!

我有以下代碼從文件夾加載圖像。

private void LoadImages() 
{ 
try 
      { 
       lstView_un.Items.Clear(); 
       lstView_un.LargeImageList.Images.Clear(); 
       DateTime d1 = DateTime.Now; 
       DateTime d2 = dtp_unlist.Value; 

       TimeSpan t = d1 - d2; 
       double NrOfDays = t.TotalDays; 
       if (d2 > d1) 
       { 

        MessageBox.Show("Please select before the current date!"); 
        return; 

       } 

       DateTime dt = DateTime.Now.AddDays(-NrOfDays); 
       lstView_un.Items.Clear(); 
       string imagesPath = (Application.StartupPath + "/UnknownFaces/"); 
       string[] extensions = new[] { ".jpg", ".jpeg", ".png" }; 
       var allfiles = Directory.GetFiles(imagesPath); 
       List<FileInfo> files = new List<FileInfo>(); 
       foreach (string f in allfiles) files.Add(new FileInfo(f)); 
       var filesSorted = files.Where(f => extensions.Contains(f.Extension.ToLower())) 
             .Where(f => f.CreationTime < dt) 
             .OrderByDescending(f => f.CreationTime); 
       this.imageList1.ImageSize = new Size(256, 256); 
       this.imageList1.ColorDepth = ColorDepth.Depth32Bit; 
       foreach (FileInfo fileInfo in filesSorted) 
       { 
        try 
        { 
         this.imageList1.Images.Add(fileInfo.Name, 
               Image.FromFile(fileInfo.FullName)); 
        } 
        catch 
        { 
         Console.WriteLine(fileInfo.FullName + " is is not a valid image."); 
        } 
       } 
       this.lstView_un.View = View.LargeIcon; 
       lstView_un.LargeImageList = this.imageList1; 
       lstView_un.Items.Clear(); 
       for (int j = 0; j < this.imageList1.Images.Count; j++) 
       { 
        ListViewItem item = new ListViewItem(); 
        item.ImageIndex = j; 
        item.Text = imageList1.Images.Keys[j].ToString(); 
        this.lstView_un.Items.Add(item); 
       } 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Something Wrong happen! "+ex.Message); 
      } 
     } 
} 

我目前的圖片加載形式以下進度條:

private void progressBar1_Click(object sender, EventArgs e) 
     { 

     } 

我試着和:(它無法正常工作)

private void timer1_Tick(object sender, EventArgs e) 
     { 
      if (this.progressBar1.Value < 50) // Should be less than progress bar max value 
      { 
       this.progressBar1.Value++; 
       if (this.progressBar1.Value == 100) //The maximum value of the progress bar 
       { 
        LoadImages();// Image loads when reached the max value 
       } 
      } 
      else 
      { 
       this.timer1.Enabled = false; 
      } 
     } 

我覺得背景工人很好,但我不知道如何使用它。 請任何人都可以幫助我,如果你知道的話。

+2

在單獨的線程中儘可能多地完成工作,因此不會鎖定用戶界面。定期更新UI以顯示進度。例如,您可以使用BackgroundWorker及其ReportProgress機制。 –

+0

好的,謝謝,很好的建議。我無法弄清楚如何使用它。請通過引用我的代碼來幫助我。 – usminuru

回答

0

下面是如何使用背景工人以進度條的例子:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Load file list here 
    int totalImageCount = 10000; 
    // Set maximum value of the progress bar 
    progressBar1.Invoke(new Action(() => { progressBar1.Maximum = totalImageCount; })); 

    for (int i = 0; i < totalImageCount; i++) 
    { 
     // Load a single image here 
     Thread.Sleep(10); 

     // User cancelled loading (form shut down) 
     if (e.Cancel) return; 
     // Set the progress 
     progressBar1.Invoke(new Action(() => { progressBar1.Value = i; })); 
    } 

    // Cleanup here 
} 

// Starts the loading 
private void button1_Click(object sender, EventArgs e) 
{ 
    // Start loading images 
    backgroundWorker1.WorkerSupportsCancellation = true; 
    backgroundWorker1.RunWorkerAsync(); 
} 

// Stops the loading 
private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // Stop the loading when the user closes the form 
    if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync(); 
} 

的關鍵是Invoke方法,它允許你在UI線程上執行代碼,而在做你的工作一個不同的線程。

我還展示瞭如何添加取消支持(可以在任何地方完成,包括取消按鈕)。

有一點需要記住的是,當你的工作正在進行時,你應該禁用UI元素,因爲你不希望多個任務同時運行。

+0

這是我需要做的一切,但請幫助我如何將它用於我的上述LoadImages()函數。你可以編輯我的代碼嗎?然後你的答案將被標記爲自動接受。 – usminuru

+0

我沒有將它集成到代碼中的原因是因爲我無法在隔離的環境中測試您的代碼。您的代碼與您的Windows窗體設計緊密結合。如果你的代碼只依賴於泛型集合,那麼對我來說集成將是一件容易的事情。因爲不是,你應該嘗試自己整合它。我已經給你所有必要的指示來做到這一點。 (閱讀評論和最後一部分。) – Aidiakapi