【问题标题】:C# Progressbar is not updated accurately in Vista or Windows7C# Progressbar 在 Vista 或 Windows7 中未准确更新
【发布时间】:2010-04-06 06:31:23
【问题描述】:
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, " ", " ");

【问题讨论】:

  • 你看到了什么?它对我来说按预期工作......
  • 显示进度的标签 = 100% 完成!但进度条似乎仍然是 80% 或 90%。不是我们想要的,对吧?
  • 我假设你在这里使用的是 Windows 窗体(因为你的代码中没有 Dispatcher 引用),我必须同意 codeka,它在这里就像一个魅力......我们需要更多细节
  • @TimothyP:我已经看到这种行为 100 次了。因此,除非您从未在 Vista 或更高版本上使用过 WinForms,否则您不会注意到。
  • 好吧,我也见过几次,当进度在一秒钟左右从 0% 快速变为 100% 时,这种情况经常发生......

标签: c# progress-bar


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这正是 Vista 及更高版本中愚蠢的进度条的工作方式。

    没有解决办法。

    向微软投诉。

    【讨论】:

    • 我认为他们对您的 cmets 投了反对票既没有帮助,也没有洞察力或尊重如果确实存在这样的错误,如果您是新的联系人,那么 devs @ microsoft 可能会有所帮助。我刚刚在 Windows 7 作品上测试了这个,就像一个魅力
    • @TimothyP -- 不存在 is 滞后...即,进度条更新落后于实时。如果值更新缓慢,那很好,但如果值更新很快,条形图就会落后。
    【解决方案3】:
      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 问题的技巧。

    【讨论】:

      【解决方案4】:
      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

      【讨论】:

        猜你喜欢
        • 2011-05-26
        • 2014-11-10
        • 2017-08-15
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 2011-10-03
        相关资源
        最近更新 更多