似乎不能让进度条动画

本文关键字:动画 不能 | 更新日期: 2023-09-27 18:18:32

好的,我有一个问题,看起来像这样。

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

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

似乎不能让进度条动画

Call

Application.EnableVisualStyles();

你的"do something here"代码会阻塞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);
    }
}

我不确定这是否是最好的解决方案,但我有这样做:

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

这是实际的后台worker

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

只是补充一点,Dave建议的解决方案只有在Konstantin建议的代码存在的情况下才有效。否则,应该考虑手动增加进度条。在DoWork中通过以下代码在循环中调用:BeginInvoke(new MethodInvoker(()) => progressBarSave。