如何在WinForms中创建无尽的进度条?

时间:2009-03-11 19:18:27

标签: winforms .net-3.5

我不知道操作可以花多长时间,我想在对话框中向用户显示进度条。我尝试过使用System.Windows.Forms.ProgressBar,但它似乎不支持它。

我想要的一个例子是Windows在互联网上寻找新驱动程序时显示的进度条。它只是在进度条上有三到四个'条形'来回移动字幕。

我该怎么做?

6 个答案:

答案 0 :(得分:24)

System.Windows.Forms.ProgressBar有一个名为Style的属性。将Style设置为Marquee可以达到您想要的效果。

编辑: Divo指出Marquee Style仅适用于

  

Windows XP Home Edition,Windows XP Professional x64 Edition,Windows Server 2003

这些评论提供了更多信息,表明只要您使用的是.NET 2.0或更高版本,它就可以在任何地方使用。

答案 1 :(得分:7)

您是否尝试将Style的{​​{1}}属性设置为System.Windows.Forms.ProgressBar

然而,令人惊讶的是,此属性仅适用于以下平台(根据MSDN):

  

Windows XP Home Edition,Windows XP Professional x64 Edition,Windows Server 2003

可能文档尚未更新到Vista。有人知道Vista的限制吗?

编辑:正如另一条评论中所述,文档似乎与支持的平台有关。应该在Vista以及Windows 7上工作。

答案 2 :(得分:6)

只需使用动画gif:)

你可以在这里做自己的: http://www.ajaxload.info/

答案 3 :(得分:1)

我发现Chris Lawl的解决方案是最好的,非常好的和干净的解决方案,只包含一个gif http://www.ajaxload.info/并且没有混乱创建永无止境的进度条。

答案 4 :(得分:1)

这对我有用。我为你创建了一个不确定的进度条。 将自定义控件添加到项目/表单并插入此代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace AnimatedCustomControls
{
  sealed class IndeterminateProgressbar : Control
  {
    private readonly List<int> positions = new List<int>();
    private readonly Timer tmrAnimation = new Timer {Interval = 5, Enabled = false};
    private readonly Timer tmrAddPosition = new Timer {Interval = 500, Enabled = true};


    public Color ProgressColor { get; set; }
    public Color InactiveColor { get; set; }

    public IndeterminateProgressbar()
    {
        DoubleBuffered = true;
        SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        ProgressColor = Color.FromArgb(40, 190, 245);
        InactiveColor = Color.FromArgb(40, 40, 40);
        tmrAnimation.Tick += tmrAnimation_Tick;
        tmrAddPosition.Tick += tmrAddPosition_Tick;
        if (!DesignMode) tmrAnimation.Start();
    }

    void tmrAddPosition_Tick(object sender, EventArgs e)
    {
        positions.Add(1);
    }

    void tmrAnimation_Tick(object sender, EventArgs e)
    {
        if (DesignMode) tmrAnimation.Stop();
        for (int i = 0; i < positions.Count; i++)
        {
            positions[i] += 2 + Math.Abs(positions[i]) / 50;
            if (positions[i] > Width) positions.RemoveAt(i);
        }
        Invalidate();
    }

    protected override void OnEnabledChanged(EventArgs e)
    {
        base.OnEnabledChanged(e);
        if (Enabled)
        {
            positions.Clear();
            positions.AddRange(new[] { Width / 10, Width / 3, Width / 2, (int)(Width * 0.7) });
        }
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        if (Enabled)
        {
            e.Graphics.Clear(BackColor);
            foreach (int i in positions)
            {
                e.Graphics.DrawLine(new Pen(Brushes.Black, 4f), i, 0, i, Height);
            }
        }
        else e.Graphics.Clear(InactiveColor);

        base.OnPaint(e);
    }
}

}

然后您应该构建解决方案,当您返回设计器时,新控件应该在您的工具箱中。将其拖到您的表单中,设置最大值和最小值以及全部。

我已经创建了一个示例程序,让您知道它是如何使用的:

        private void Form1_Load(object sender, EventArgs e)
    {
        indeterminateProgressbar1.BackColor = Color.FromArgb(40, 190, 245); //it's an nice color ;)
        indeterminateProgressbar1.Size = new Size(400, 4); //make it small in the height looks better
        indeterminateProgressbar1.Visible = true;
    }

答案 5 :(得分:0)

可能有更好的方法,但有一种方法就是在值到达结束时将值设置为0(假设您的任务未完成)