2008-11-23 50 views
66

我正在使用C#和Windows窗體。我有一個正常的進度條在程序中正常工作,但現在我有另一個操作,其持續時間不易計算。我想顯示一個進度條,但不知道啓動/停止滾動字幕的最佳方式。我希望能夠像設置選取框的速度一樣簡單,然後有一個start()和stop(),但它看起來並不那麼簡單。我必須在後臺運行一個空循環嗎?我該如何做到最好?謝謝Windows窗體ProgressBar:啓動/停止選取框的最簡單方法?

+3

這是關於選擇進度條類型的一篇很好的文章http://msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx – 2012-02-24 00:26:12

回答

93

使用樣式設置爲Marquee的進度條。這代表了一個不確定的進度條。

myProgressBar.Style = ProgressBarStyle.Marquee; 

您還可以使用MarqueeAnimationSpeed屬性來設置它需要多長時間顏色的小方塊在你的進度條動畫。

+18

如果'視覺樣式'未啓用,'Marquee'將不會渲染。啓用`Application.EnableVisualStyles();` – Pooven 2013-05-15 09:49:02

-3

你可以使用Timer(System.Windows.Forms.Timer)。

掛鉤它的Tick事件,提前然後進度條,直到達到最大值。當它達到(達到最大值)並且您沒有完成作業時,將進度欄值重新設置爲最小值。

...就像Windows資源管理器:-)

+1

這違反了「不要重新啓動進度」。和糟糕的UI/UX。請參閱:http://msdn.microsoft.com/en-us/library/windows/desktop/dn742475%28v=vs.85%29.aspx – urbanhusky 2014-06-10 14:05:29

2

有與代碼MSDN上這個話題是一個不錯的article。我假設將Style屬性設置爲ProgressBarStyle.Marquee是不合適的(或者是你正在試圖控制的 - 我不認爲有可能停止/開始這個動畫,儘管你可以控制速度如@Paul所示)。

9

這不是他們的工作方式。通過使其可見,您可以「開始」選取框樣式進度條,您可以通過隱藏它來停止它。你可以改變Style屬性。

49

要啓動/停止動畫,你應該這樣做:

要啓動:

progressBar1.Style = ProgressBarStyle.Marquee; 
progressBar1.MarqueeAnimationSpeed = 30; 

要停止:

progressBar1.Style = ProgressBarStyle.Continuous; 
progressBar1.MarqueeAnimationSpeed = 0; 
+6

停止時不需要設置`MarqueeAnimationSpeed`,啓動時它通常有一個合理的值。無需在每次啓動時進行設置。 – icktoofay 2010-05-12 17:10:18

7

此代碼是一個登錄形式,其中的一部分用戶等待認證服務器響應。

using System; 
using System.ComponentModel; 
using System.Threading; 
using System.Windows.Forms; 

namespace LoginWithProgressBar 
{ 
    public partial class TheForm : Form 
    { 
     // BackgroundWorker object deals with the long running task 
     private readonly BackgroundWorker _bw = new BackgroundWorker(); 

     public TheForm() 
     { 
      InitializeComponent(); 

      // set MarqueeAnimationSpeed 
      progressBar.MarqueeAnimationSpeed = 30; 

      // set Visible false before you start long running task 
      progressBar.Visible = false; 

      _bw.DoWork += Login; 
      _bw.RunWorkerCompleted += BwRunWorkerCompleted; 
     } 

     private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      // hide the progress bar when the long running process finishes 
      progressBar.Hide(); 
     } 

     private static void Login(object sender, DoWorkEventArgs doWorkEventArgs) 
     { 
      // emulate long (3 seconds) running task 
      Thread.Sleep(3000); 
     } 

     private void ButtonLoginClick(object sender, EventArgs e) 
     { 
      // show the progress bar when the associated event fires (here, a button click) 
      progressBar.Show(); 

      // start the long running task async 
      _bw.RunWorkerAsync(); 
     } 
    } 
}  
0

許多很好的答案已經在這裏,但你還需要記住,如果你正在做的UI線程(通常是一個壞主意)在長時間運行的處理,那麼你將無法看到字幕移動無論是。

相關問題