更改值时禁用.NET进度栏animation?

我意识到有关于animation和进度条的其他问题,但他们似乎是摆脱在进度条顶部绘制的animation,即。 这个重点在旅行。

我想要做的是摆脱我设置进度条的新值时使用的animation。 我现在的问题是正在运行的动作完成,然后进度条继续增加到动作完成的最大位置。

换句话说,如果我将进度条的Value属性设置为50,我希望它立即到达中间位置(如果最大为100),不要像现在那样缓慢地build立进度条到该位置。

如果对于已经涉及到的问题确实存在一个问题,那么只要重复一次,我就乐于删除它,但是我找不到任何问题。

这是我find的一个: 禁用WinForms ProgressBaranimation ,它处理animation高亮,而这不是我说的。

下面是一个简单的LINQPad演示,展示了这个问题:

void Main() { using (var fm = new Form()) { var bt = new Button { Text = "Start", Location = new Point(8, 8), Parent = fm, }; var pb = new ProgressBar { Top = bt.Top + bt.Height + 8, Width = fm.ClientRectangle.Width - 16, Left = 8, Parent = fm }; bt.Click += (s, e) => { bt.Enabled = false; Thread t = new Thread(new ThreadStart(() => { Thread.Sleep(1000); bt.BeginInvoke(new Action(() => { pb.Value = 50; })); Thread.Sleep(1000); bt.BeginInvoke(new Action(() => { pb.Value = 100; })); bt.BeginInvoke(new Action(() => { bt.Enabled = true; })); })); t.Start(); }; fm.ShowDialog(); } } 

编辑1:这是Windows 7,玻璃主题,所以是的,我敢打赌,这是具体到7或可能还Vista。

这里有一个GIFanimation,显示了这个问题,从上面的项目。 您可以看到,只要启用该button,中途标记设置后1秒,进度条就会在button启用之后以100%的比例animation。

如上所示,将button设置为启用并将进度条设置为100将“同时”完成。 基本上,我不希望逐步积累的进度栏,我希望它直接跳到50%,然后到100%,同时启用button。

LINQPad演示


编辑2:为了回应David Heffernan的回答,我改变了上面的代码:

 bt.BeginInvoke(new Action(() => { pb.Value = 51; pb.Value = 50; })); Thread.Sleep(1000); bt.BeginInvoke(new Action(() => { pb.Maximum = 101; pb.Value = 101; pb.Maximum = 100; pb.Value = 100; })); 

这个animationfunction是在Aero主题的Vista中引入的。

虽然有一个解决方法。 如果向后移动进度,则不会显示animation。 所以如果你想让它立刻前进50,那么将值增加51,然后立即减1。

你接近100%,因为你不能把价值设置为101(我假设最大值设置为100),你会陷入冲突。 相反,将“最大值”设置为1000,比如增加到1000,减less到999,然后移回到1000。

无论如何,这是有点怪异的,但它有给你所需的效果的好处!

以下是我的扩展方法,基于David Heffernan的推荐 :

把它包起来,把它隐藏起来,假装它不在那里!

 public static class ExtensionMethods { /// <summary> /// Sets the progress bar value, without using Windows Aero animation /// </summary> public static void SetProgressNoAnimation(this ProgressBar pb, int value) { // To get around this animation, we need to move the progress bar backwards. if (value == pb.Maximum) { // Special case (can't set value > Maximum). pb.Value = value; // Set the value pb.Value = value - 1; // Move it backwards } else { pb.Value = value + 1; // Move past } pb.Value = value; // Move to correct value } } 

还有一种方法可以跳过vista风格的进度条的animation:只需将SetState()控件设置为PBST_PAUSED ,然后设置该值并最终将其设置回PBST_NORMAL

我绝对解决这个问题在VB中…

 Sub FileSaving() With barProgress .Minimum = 0 .Maximum = 100000000 .Value = 100000 End With For ... saving_codes ... With barProgress .Maximum = .Value * (TotalFilesCount / SavedFilesCount) End With Next End Sub