我知道在SO上有关于动画和进度条的其他问题,但它们似乎围绕着如何消除进度条上方绘制的动画,即沿其行进的高亮部分。
我想做的是消除设置进度条新值时使用的动画。我现在遇到的问题是运行的操作完成后,进度条继续增加到它们的最大位置之后。
换句话说,如果我将进度条的Value属性设置为50,则希望它立即移动到中间位置(如果max为100),而不是像现在一样缓慢地建立进度条到该位置。
如果确实有一个关于这个问题的SO问题,只需将其关闭为重复项,我会很乐意删除它,但我找不到任何问题。
这是我找到的一个:禁用WinForms ProgressBar动画,它处理正在进行动画的高亮显示,这不是我所说的。
这里是一个简单的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。
这里有一个GIF动画,展示了上面提到的问题。您可以看到,按钮在启用后1秒钟,即在设置了一半的标记后,进度条会动画地达到100%,之后按钮才变为启用状态。
如上所述,将按钮设置回启用状态并将进度条设置为100是“同时进行”的。基本上,我不想要进度条的渐进式增加,我希望它直接跳到50%,然后在按钮启用的同时立即跳到100%。
编辑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; }));