似乎无法获得动画的进度条

时间:2011-12-19 22:13:10

标签: c# winforms

好的,所以我遇到了这样的问题。

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...
         }
}

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

4 个答案:

答案 0 :(得分:20)

呼叫

Application.EnableVisualStyles();

在申请的最开始。

答案 1 :(得分:6)

您的“在此做一些事情”代码将阻止UI线程,因此在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);
    }
}

答案 2 :(得分: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 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;
            }
        }
    }

我通过必须检查全局变量的函数来控制它

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;
    }

答案 3 :(得分:0)

只是为了补充一点,Dave建议的解决方案只有在Konstantin的建议代码存在时才有效。否则,应该考虑通过DoWork中的以下代码手动增加循环中的progressbar.value: BeginInvoke(new MethodInvoker(()=> progressBarSave.Value + = progressBarSave.Step));