Кажется, не получается получить прогрессбар для анимации - PullRequest
7 голосов
/ 20 декабря 2011

ОК, так что у меня проблема с таким видом.

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 ]

20 голосов
/ 27 марта 2013

Вызов

Application.EnableVisualStyles();

в самом начале вашей заявки.

6 голосов
/ 20 декабря 2011

Ваш код "сделать что-то здесь" блокирует поток пользовательского интерфейса, поэтому вы не увидите обновления индикатора выполнения, пока не завершится метод 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 голосов
/ 05 января 2017

Просто в дополнение, решение, предложенное Дейвом, будет работать, только если существует код, предложенный Константином. В противном случае следует подумать о ручном увеличении progressbar.value в цикле с помощью следующего кода в DoWork: BeginInvoke (new MethodInvoker (() => progressBarSave.Value + = progressBarSave.Step));

0 голосов
/ 20 декабря 2011

Я не уверен, что это лучшее решение, но у меня так:

    //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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...