我在Winforms中使用滚动条执行了一些测试。我有以下代码,似乎是正确的,但我从来没有看到滚动条完全填充。当滚动条值达到100时,滚动绘制如此图所示(约50%)。
这是我使用的示例代码:
private void animate_scroll(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
progressBar1.Step = 1;
ThreadPool.QueueUserWorkItem(new WaitCallback(AnimateScroll));
}
private void AnimateScroll(object state)
{
while (true)
{
mValue = (mValue + 1) % 101;
this.Invoke((MethodInvoker)delegate()
{
progressBar1.Value = mValue;
System.Diagnostics.Debug.WriteLine(progressBar1.Value);
});
System.Threading.Thread.Sleep(10);
}
}
private int mValue = 0;
答案 0 :(得分:13)
根据以下David Heffernan's answer,问题是由Windows 7中添加的动画引起的。该问题在以下技巧中得到解决:
progressBar1.Value = mValue;
progressBar1.Value = mValue - 1;
答案 1 :(得分:1)
这种情况正在发生,因为WinForms ProgressBar控件中内置了动画。要自己查看,只需更改animate_scroll
方法,如下所示:
private void animate_scroll(object sender, EventArgs e)
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
progressBar1.Step = 1;
// ThreadPool.QueueUserWorkItem(new WaitCallback(AnimateScroll));
// here's the change:
progressBar1.Value = 100;
}
正如您将看到的,当您以编程方式将值从0(默认值)更改为100时,ProgressBar控件会自动设置动画以将其内容扩展为与该值对应的宽度。您的原始代码发送的值更新速度快于控件可以在值之间设置动画。
似乎没有办法改变这个动画的工作方式。也许只需将Style
属性设置为Marquee
即可满足您的使用案例,该属性会在控件上滚动突出显示的部分。
答案 2 :(得分:0)
在执行实际功能之前,我正在做相同类型的事情来测试进度条。我估计我的最终功能将花费大约5秒钟才能完成,因此我将进度条设置为最大值为100,步长为1。然后,我创建了一个到100的循环,并每个循环执行Thread.Sleep(50)持续约5秒钟的时间。
for( int ii = 0; ii < 110; ++ii)
{
Thread.Sleep(50);
form.statusOutputMainChannel(ii.ToString());
form.progressBarVerifyUpdate();
}
我发现我不得不再次调用bar.PerformStep()方法10次,以使动画赶上该值。
这是使其工作的另一种“丑陋”方式,但我不清楚其他答案是否确实针对“此问题已解决”。
答案 3 :(得分:0)
尝试一下。它对我有用。
If ProgressBar1.Value = ProgressBar1.Maximum Then
wait(500)
ProgressBar1.Value = ProgressBar1.Maximum
End If
等待子为:
Public Sub wait(ByVal interval As Integer)
' Loops for a specificied period of time (milliseconds)
Dim sw As New Stopwatch
sw.Start()
Do While sw.ElapsedMilliseconds < interval
' Allows UI to remain responsive
Application.DoEvents()
Loop
sw.Stop()
End Sub