4

我有这个代码:

for(int k = 0; k<11; k++)
{
    pBar.Maximum = 10;
    pBar.Value = k;
    if (pBar.Maximum == k)
        pBar.Value = 0;
}

但是,问题是,进度条在大约 60% 满时会被重置。如何确保进度条在重置之前一直填满?

4

4 回答 4

2
pBar.Maximum = 10;
int count = 0;

Timer timer = new Timer();
timer.Interval = 1000;
timer.Tick += (source, e) =>
{
    pBar.Value = count;
    if (pBar.Maximum == count)
    {
        pBar.Value = 0;
        timer.Stop();
    }
    count++;
}
timer.Start();

您的问题是您正在使用循环。您需要使用计时器,以便程序有时间执行检查/分配和更新屏幕。

该代码将 for 循环替换为调用循环体的计时器。由于计时器没有索引变量,因此它在计时器之外进行初始化(计数)并随着每个滴答声更新。

于 2012-07-15T19:37:43.460 回答
2

第一:没有任何理由pBar.Maximum每个 interarion进行分配。做就是了:

pBar.Maximum = 10;
for(int k = 0; k<11; k++)
{
   pBar.Value = k;
   if (pBar.Maximum == k)
      pBar.Value = 0;
}

第二:您的代码导致阻塞迭代。它永远无法正确运行。使用多线程并value根据 some更改进度eventtick无论是什么,而不是循环,就像在这里完成的那样。

于 2012-07-15T19:38:06.327 回答
2

如果你切换到经典模式,这个故障就会消失。在重置之前,进度条将显示为完全绘制。

这是因为在经典模式下,绘画操作是同步的,并且在Valuesetter 返回之前完成,但在主题模式下,当您增加值时会播放某种动画,这需要一些时间才能播放。

相反,当您减小该值时,没有动画;进度条立即缩小。

这就是为什么它只显示大约 60% 的原因:在进度条有时间绘制最后几个增量的动画之前,您减小了值(立即完成)。

于 2012-07-15T20:15:21.770 回答
1

我终于找到了解决这个问题的方法,并在这里写了。这个想法来自THIS SO question。

     progressBar1.Value = e.ProgressPercentage;
     if (e.ProgressPercentage != 0)
         progressBar1.Value = e.ProgressPercentage - 1;
     progressBar1.Value = e.ProgressPercentage;
     if (progressBar1.Maximum == e.ProgressPercentage)
         progressBar1.Value = 0;
于 2013-03-24T23:40:32.297 回答