【问题标题】:Progress bar reaches maximum but animation does not complete进度条达到最大值但动画未完成
【发布时间】:2023-03-23 22:09:01
【问题描述】:

进度条(滚动条)在达到最大值之前没有完成,即使我已经做了一个 if 语句,它只会在完成后返回它。

[编辑:我尝试了David Heffernan's answer,现在它几乎到了尽头,但还没有结束。]

What it looks like

我知道 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 后停止计时器,但没有任何变化。

任何建议将不胜感激。

【问题讨论】:

  • “未完成”是什么意思?你是说价值永远不会达到100?还是达到100但进度条未满?还是进度条消失得太快?我不明白。您的示例中没有包含很多代码。
  • 仅供参考,您无需多次设置Step 属性...
  • “进度条(滚动条)在达到最大值之前没有完成” 这不是设计的吗?最大值定义完成度。
  • @JohnWu 我的意思是它达到了 100,但正如你所说,栏没有满。
  • 完成后我需要它来填充和重置

标签: c# .net visual-studio progress-bar


【解决方案1】:

除了使用 Timer 之外,您还可以尝试通过 Thread 来实现。这是一个演示,您可以参考。使用 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; }));
}

【讨论】:

  • 谢谢,这可行,但是我不知道进度条达到最大值后如何重置?
  • 如果要在 ProcessBar 达到最大值时创建延续。您可以使用方法Task.ContinueWith 尝试Task。你可以参考我最近的回复。
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2020-06-25
  • 2014-06-22
  • 2020-06-08
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多