Как я могу сделать бесконечный прогрессбар в WinForms? - PullRequest
10 голосов
/ 11 марта 2009

Я не знаю, сколько времени может занять действие, и я хочу отобразить индикатор выполнения для пользователя в диалоговом окне. Я пытался использовать System.Windows.Forms.ProgressBar, но, похоже, это не поддерживается.

Примером того, что я хотел бы, является индикатор выполнения, который Windows показывает, когда ищет новые драйверы в Интернете. У него только три или четыре «бара», идущие вперед и назад в стиле «шатер» на индикаторе прогресса.

Как я могу это сделать?

Ответы [ 6 ]

24 голосов
/ 11 марта 2009

System.Windows.Forms.ProgressBar имеет свойство с именем Style. Установка Style на Marquee обеспечит эффект, который вы ищете.

РЕДАКТИРОВАТЬ: Divo указывает на Marquee Стиль доступен только на

Windows XP Home Edition, Windows XP Professional x 64 Edition, Windows Server 2003

Комментарии содержат еще больше информации о том, что это работает везде, если вы используете .NET 2.0 или выше.

7 голосов
/ 11 марта 2009

Вы пытались установить для свойства <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.progressbar.style.aspx" rel="nofollow noreferrer">Style</a> System.Windows.Forms.ProgressBar значение Marquee?

Однако, что удивительно, это свойство доступно только на следующих платформах (согласно MSDN ):

Windows XP Home Edition, Windows XP Professional x 64 Edition, Windows Server 2003

Возможно, документация не была обновлена ​​до Vista. Кто-нибудь знает об ограничении на Vista?

РЕДАКТИРОВАТЬ: Как опубликовано в другом комментарии, документация, кажется, неправильно в отношении поддерживаемых платформ. Должно работать как на Vista, так и на Windows 7.

6 голосов
/ 11 марта 2009

Просто используйте анимированный GIF:)

Вы можете сделать свой собственный здесь: http://www.ajaxload.info/

1 голос
/ 30 апреля 2014

Вот что у меня сработало. Я создаю неопределенный индикатор прогресса для вас. Добавьте пользовательский элемент управления в свой проект / форму и вставьте этот код:

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;
    }
1 голос
/ 17 августа 2010

Я нашел решение Криса Лоула лучшим, очень хорошим и чистым решением, просто включив gif http://www.ajaxload.info/ и не создавая беспорядка, никогда не заканчивая индикатором прогресса.

0 голосов
/ 11 марта 2009

Возможно, есть лучший способ, но один из способов - просто установить значение обратно в 0, когда оно достигает конца (при условии, что ваша задача не выполнена)

...