Как я могу сделать бесконечный progressbar в WinForms?
Я не знаю, сколько времени может занять действие, и я хочу отобразить индикатор выполнения для пользователя в диалоговом окне. Я пробовал использовать систему.Окна.Формы.ProgressBar, но он, похоже, не поддерживает его.
примером того, что я хотел бы, является индикатор выполнения, который windows показывает вам, когда он ищет новые драйверы в интернете. У него просто есть три или четыре "бара", идущих туда и обратно в стиле шатра на прогресс-баре.
Как я могу это сделать?
6 ответов
система.Окна.Формы.ProgressBar имеет свойство под названием Style
. Настройка Style
до Marquee
достигнет эффекта, который вы ищете.
EDIT: Диво указывает на шатер стиль доступно только на
Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003
комментарии предоставляют еще больше информации, указывающей, что это, похоже, работает везде, пока вы используете .NET 2.0 или выше.
вы пробовали установить Style
свойства System.Windows.Forms.ProgressBar
to Marquee
?
однако, удивительно, что это свойство доступно только на следующих платформах (согласно MSDN):
Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003
может быть, что документация не обновлена до Vista. Кто-нибудь знает об ограничении Vista?
изменить: как размещенная в другом комментарии документация кажется неправильной в отношении поддерживаемых платформ. Должно работать на Vista, а также Windows 7.
просто используйте анимированный gif:)
вы можете сделать свой собственный здесь: http://www.ajaxload.info/
Я нашел решение Криса Лоула лучшим, очень хорошим и чистым решением, просто включите gif http://www.ajaxload.info/ и никакого беспорядка, создающего бесконечный индикатор выполнения.
это то, что работал для меня. Я создаю для вас неопределенный progressbar. Добавьте пользовательский элемент управления в проект / форму и вставьте этот код:
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;
}
может быть лучший способ, но один из способов-просто установить значение обратно в 0, когда он достигнет конца (при условии, что ваша задача не завершена)