在Vista或Windows7中,C#Progressbar未准确更新

时间:2010-04-06 06:31:23

标签: c# progress-bar

public partial class Form1 : Form
{
  //....
  private void timer1_Tick(object sender, EventArgs e)
  {
     if (this.progressBar1.Value >= 100)
     {
         this.timer1.Stop();
         this.timer1.Enabled = false;
     }
     else
     {
         this.progressBar1.Value += 10;
         this.label1.Text = Convert.ToString(this.progressBar1.Value);                
     }
  }
  //......
}

这里我使用计时器来更新进度条值。它在XP中运行良好。但是在Windows7或Vista中,进度值设置为100但图形进度不是100!

搜索一些线程发现其动画在Vista / Windows7中滞后。

如何摆脱这件事?

我不想使用以下内容来消除Vista / Window7的外观和感觉:

SetWindowTheme(progressBar1.Handle, " ", " ");

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。 Fozi的tipps帮助了我。除非最大值(100%),否则Samir的解决方案将正常工作。为了使这项工作也达到100%,必须在之前增加最大值。以下对我来说很好。

if (NewValue < progressBar.Maximum)
{
  progressBar.Value = NewValue + 1;
  progressBar.Value--;
}
else
{
  progressBar.Maximum++;
  progressBar.Value = progressBar.Maximum;
  progressBar.Value--;
  progressBar.Maximum--;
}

答案 1 :(得分:1)

这就是愚蠢的进度条在Vista及更高版本中的运作方式。

没有解决办法。

抱怨微软。

答案 2 :(得分:1)

  private void timer1_Tick(object sender, EventArgs e)
    {

        if (progressBar1.Maximum == 1) progressBar1.Maximum = 100;
        if (progressBar1.Value==100) {
            progressBar1.Value = 0;
            return;
        }
        progressBar1.Increment(1);
        if (progressBar1.Value == 100) {
            progressBar1.Value = 1; progressBar1.Maximum = 1;
            progressBar1.Update();
        }
    }

这些是我通过适当的全面绘制进度条来解决win7问题的技巧。

答案 3 :(得分:0)

public partial class Form1 : Form
{
  //....
  private void timer1_Tick(object sender, EventArgs e)
  {
    if (this.progressBar1.Value >= 100)
    {
     this.timer1.Stop();
     this.timer1.Enabled = false;
    }
    else
    {
      int tempValue = this.progressBar1.Value + 10;
      if (tempValue < 100 && tempValue >=0 )
      {
       this.progressBar1.Value = tempValue + 1;
       this.progressBar1.Value = tempValue;
      }
      else if (tempValue >= 100)
      {
       this.progressBar1.Value = 100;
       this.progressBar1.Value = 99;
       this.progressBar1.Value = 100;
      }
     this.label1.Text = Convert.ToString(this.progressBar1.Value);                
    }
  }

//......
}

else部分使进度条现在看起来不错。但是应该有一些标准的进度条方式。这个想法来自Fozi的评论here