进度条未达到100%

时间:2014-05-05 16:06:20

标签: c# .net winforms scrollbar

我在Winforms中使用滚动条执行了一些测试。我有以下代码,似乎是正确的,但我从来没有看到滚动条完全填充。当滚动条值达到100时,滚动绘制如此图所示(约50%)。

enter image description here

这是我使用的示例代码:

    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;

4 个答案:

答案 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次,以使动画赶上该值。

这是使其工作的另一种“丑陋”方式,但我不清楚其他答案是否确实针对“此问题已解决”。

  • Rob

答案 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