2011-12-19 35 views
6

好吧,所以我有这样的问题。似乎无法获得进度条动画

public Class A{ 

    public A(){ 
     progressBar.Style = ProgressBarStyle.Marquee; 
     progressBar.MarqueeAnimationSpeed = 0;  
    } 

    public void DoSomething(){ 
     if(checkpasses){ 
      progressBar.MarqueeAnimationSpeed = 100; 
      //Do something here... 
      progressBar.MarqueeAnimationSpeed = 0; 
     } 
     else 
      //Do nothing... 
     } 
} 

问题是我的进度条不会开始移动。首先,我认为它不会自己创建一个新的线程(我发现有线),所以我尝试创建一个线程,但仍然是相同的结果。什么都没发生。这是我忘记的东西吗?

+0

你想从另一个线程访问progressBar吗? – geniaz1 2011-12-19 22:15:52

+0

WinForms? WPF? SilverLight的?什么?没有像“C#ProgressBar”这样的东西。 – 2011-12-19 22:20:29

+0

哦,对不起忘了提及,是的,它是WinForms。 – user1106784 2011-12-19 22:22:54

回答

6

你“在这里做什么”代码将阻止用户界面线程,这样你就不会看到进度条更新,直到DoSomething的方法完成之后。当时你将动画速度设置为0.

尝试在单独的线程上放置“在此处执行某些操作”代码。当该线程完成设置动画速度回到0

事情是这样的:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); 
     backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     progressBar1.MarqueeAnimationSpeed = 0; 
     progressBar1.Style = ProgressBarStyle.Blocks; 
     progressBar1.Value = progressBar1.Minimum; 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     DoSomething(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     progressBar1.Style = ProgressBarStyle.Marquee; 
     progressBar1.MarqueeAnimationSpeed = 100; 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void DoSomething() 
    { 
     Thread.Sleep(2000); 
    } 
} 
+0

啊!谢谢 – user1106784 2011-12-19 22:30:18

+0

我在任务中放置了“在此处做某事”的代码,但仍未看到动画的字幕。 – James 2017-06-22 19:50:06

0

我不知道这是否是最好的解决办法,但我必须这样说:

//this is the action item (button click) 
    private void importSFNFReportButton_Click(object sender, EventArgs e) 
    { //I run 
     backgroundWorker6Progress.RunWorkerAsync(); //this is how I start the progress bar 'movement' 
     bgwImportSF.RunWorkerAsync(); //this is another task that is lauchned after the progress bar is initiated 
    } 

这是实际的后台工作

private void backgroundWorker6Progress_DoWork(object sender, DoWorkEventArgs e) 
    { 
     bool cont = true; 
     while (cont) 
     { 
      PauseForMilliSeconds(100); 
      updateProgressbar1(false); 
      if (noTasksExistCheck()) 
      { 
       updateProgressbar1(true); 
       cont = false; 
      } 
     } 
    } 

这是一个delegate-我就打电话给自动增加进度条指示器

delegate void updateProgressBarStatus(bool done); 
    private void updateProgressbar1(bool done) 
    { 
     if (progressBar1.InvokeRequired) 
     { 
      updateProgressBarStatus del = new updateProgressBarStatus(updateProgressbar1); 
      progressBar1.Invoke(del, new object[] { done }); 
     } 
     else 
     { 
      if (progressBar1.Value == progressBar1.Maximum) 
      { 
       progressBar1.Value = progressBar1.Minimum; 
      } 
      progressBar1.PerformStep(); 

      if (done == true) 
      { 
       progressBar1.Value = progressBar1.Minimum; 
      } 
     } 
    } 

我控制它通过必须检查全球variba乐

noTasksExistCheck() 

这是计时器暂停

public static DateTime PauseForMilliSeconds(int MilliSecondsToPauseFor) 
    { 
     System.DateTime ThisMoment = System.DateTime.Now; 
     System.TimeSpan duration = new System.TimeSpan(0, 0, 0, 0, MilliSecondsToPauseFor); 
     System.DateTime AfterWards = ThisMoment.Add(duration); 
     while (AfterWards >= ThisMoment) 
     { 
      System.Windows.Forms.Application.DoEvents(); 
      ThisMoment = System.DateTime.Now; 
     } 
     return System.DateTime.Now; 
    } 
15

呼叫

Application.EnableVisualStyles(); 

在你的应用程序的开始。

+1

血腥的地狱没有别的工作,直到这!谢谢!! – joshcomley 2013-04-19 19:51:10

+1

太棒了!谢谢,那也解决了我的问题。 – mbue 2013-06-03 07:58:44

+0

我在一个非常庞大的代码库中,遇到了这个问题。我认为这是不可能的,但是在数百万行代码中,没有人会这样称呼它。我在应用程序启动和bam开始时添加了这一点,不确定的进度栏工作。谢谢! – Josh 2017-01-09 16:58:57

0

只是为了补充一点,Dave建议的解决方案只有在康斯坦丁的建议代码存在的情况下才有效。否则,您应该考虑在DoWork中通过以下代码手动增加循环中的progressbar.value:BeginTimer()