2010-04-06 74 views
3
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!C#进度条未在Vista或Windows7中准确更新

搜索某些线程发现它的动画滞后于Vista/Windows7。

如何摆脱这个东西?

我不想使用松散VISTA/Window7的的外观和感觉:

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

你在看什么呢?它按预期对我工作... – 2010-04-06 06:33:51

+1

显示进度= = 100%的标签完成!但进度条似乎仍然是80%或90%。不是我们想要的,对吧? – Samir 2010-04-06 06:36:32

+0

我假设你在这里使用Windows窗体(因为你的代码中没有Dispatcher引用),我必须同意codeka,它在这里的作用就像一个魅力... 我们将需要更多的细节 – TimothyP 2010-04-06 06:44:15

回答

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部分使进度条看起来OK。但是应该有一些标准的进度条方式。这个想法来自Fozi的评论here

1

这仅仅是愚蠢的进度条在Vista和更高版本是如何工作的。

没有修复。

向微软投诉。

+0

为什么downvote? – leppie 2010-04-06 06:48:40

+1

我认为他们downvoted你的意见既不有用,insightfull或尊重 如果确实有这样的错误,devs @ microsoft可能会帮助,如果你新的谁联系。我只是在Windows 7作品上测试了这个,就像一个魅力 – TimothyP 2010-04-06 07:08:58

+0

@TimothyP - 没有滞后......即进度条更新落后于实时。如果值更新缓慢,那么它很好,但如果值更新得很快,那么吧就会落后。 – timfoden 2014-01-31 12:07:48

2

我有同样的问题。 Fozi的tipps正在帮助我。萨米尔的解决方案将工作正常,除非最大(100%)。为了使这项工作也达到100%,以前必须增加最大值。以下工作适合我。

if (NewValue < progressBar.Maximum) 
{ 
    progressBar.Value = NewValue + 1; 
    progressBar.Value--; 
} 
else 
{ 
    progressBar.Maximum++; 
    progressBar.Value = progressBar.Maximum; 
    progressBar.Value--; 
    progressBar.Maximum--; 
} 
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的问题。