我有这个代码:
for(int k = 0; k<11; k++)
{
pBar.Maximum = 10;
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
然而,问题是,进度条在大约60%满时会被重置。如何确保进度条在重置之前一直充满?
首先:没有任何理由在每个interrion上分配pBar.Maximum
。只需:
pBar.Maximum = 10;
for(int k = 0; k<11; k++)
{
pBar.Value = k;
if (pBar.Maximum == k)
pBar.Value = 0;
}
第二:您的代码导致阻塞迭代。它不可能有正确的行为。使用多线程并根据一些event
、tick
更改进度value
,而不是像这里所做的那样在循环中。
如果切换到经典模式,此故障将消失。进度条在重置之前将显示为完全绘制。
这是因为在经典模式中,绘制操作是同步的,并且在Value
setter返回之前完成,但在主题模式中,当您增加值时会播放某种动画,这需要一些时间才能播放。
相反,当您减小该值时,将不存在动画;进度条立即收缩。
这就是为什么它只显示为大约60%满:在进度条有时间绘制最后几个增量的动画之前,您可以减小该值(立即完成)。
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循环替换为一个调用循环主体的计时器。由于计时器没有索引变量,因此它在计时器(计数)之外进行初始化,并随每个刻度更新。
我终于找到了这个问题的解决方案,并在这里写下了它。这个想法来自于这个问题。
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;