Индикатор выполнения достигает максимума, но анимация не завершена - PullRequest
0 голосов
/ 25 марта 2020

Индикатор выполнения (Rollbar) не завершается до достижения максимума, хотя я сделал заявление if, которое вернет его только после завершения.

[РЕДАКТИРОВАТЬ: Я пытался Ответ Дэвида Хеффернана и теперь он почти подходит к концу, но не совсем.]

Как это выглядит

Я знаю, что утверждение if выглядит странно, но именно так я интерпретировал ответ

        private void Bartimer_Tick(object sender, EventArgs e)
        {
            if (Rollbar.Value == 1000)
            {
                Rollbar.Value = 1000;
                Rollbar.Increment(-1);
                Rollbar.Value = 0;
                Bartimer.Stop();
            }
            else
            {
                Rollbar.Increment(1);
            }
        }

        private void Rollbtn_Click(object sender, EventArgs e)
        {
            Rollbar.Minimum = 0;
            Rollbar.Maximum = 1000;
            Bartimer.Start();
        }

У меня такое ощущение, что это как-то связано со скоростью анимации или интервалом таймера.

Я уже подходил к этому уже по-разному, пытаясь остановить таймер после бар достигает 0, но ничего не меняется.

Любые предложения приветствуются.

1 Ответ

0 голосов
/ 27 марта 2020

Помимо использования таймера, вы можете попытаться достичь его через поток. Вот демо, может быть, вы можете обратиться к. Использование Thread.Sleep для имитации Timer.Interval.

private void button1_Click(object sender, EventArgs e)
{
    Rollbar.Minimum = 0;
    Rollbar.Maximum = 1000;

    Thread thread = new Thread(new ThreadStart((delegate
    {
        for (int i = 1; i <= 1000; i++)
        {
            Rollbar.Invoke(new MethodInvoker(delegate { Rollbar.Value = i; }));
            Thread.Sleep(100);
        }
    })));
    thread.Start();
}

Обновление: использование задачи

private void button1_Click(object sender, EventArgs e)
{
    Rollbar.Minimum = 0;
    Rollbar.Maximum = 1000;

    var task = new Task(() =>
    {
        for (int i = 1; i <= 1000; i++)
        {
            Rollbar.Invoke(new MethodInvoker(delegate { Rollbar.Value = i; }));
            Thread.Sleep(100);
        }
    });
    task.Start();
    task.ContinueWith(t => Reset());
}

void Reset()
{
    Thread.Sleep(1000);
    Rollbar.Invoke(new MethodInvoker(delegate { Rollbar.Value = 0; }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...