Как я могу сделать бесконечный индикатор выполнения в WinForms?
Автор вопроса: MalfistОтветов: 6
Я не знаю, сколько времени может занять действие, и я хочу отобразить индикатор выполнения для пользователя в диалоговом окне. Я пытался использовать System.Windows.Forms.ProgressBar, но, похоже, он его не поддерживает.
Примером того, что я хотел бы, является индикатор выполнения, который Windows показывает вам, когда он ищет новые драйверы в Интернете. У него просто есть три или четыре "полосы", идущие вперед и назад в стиле бегущей строки на индикаторе выполнения.
System.Windows.Forms.ProgressBar имеет свойство с именем Style. Установка Style на Marquee позволит достичь желаемого эффекта.
EDIT:Divo указывает на бегущую строку Стиль доступен только на
Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003
В комментариях содержится еще больше информации, указывающей на то, что это работает везде, если вы используете .NET 2.0 или выше.
Ответ 2 · рейтинг 7 · Dirk Vollmar
Вы пытались установить для свойства StyleSystem.Windows.Forms.ProgressBar значение Marquee?
Однако неожиданно это свойство доступно только на следующих платформах (согласно MSDN):
Возможно, документация не была обновлена до Vista. Кто-нибудь знает об ограничении на Vista?
РЕДАКТИРОВАТЬ: Как указано в другом комментарии, документация кажется неправильной в отношении поддерживаемых платформ. Должен работать как на Vista, так и на Windows 7.
Ответ 3 · рейтинг 6 · Chris Lawlor
Просто используйте анимированный gif :)
Вы можете сделать свой собственный здесь: http://www.ajaxload.info/
Ответ 4 · рейтинг 1 · NightlyHakr
Я нашел решение Криса Лоула лучшим, очень хорошим и чистым решением, просто включите gif http://www.ajaxload.info/ и никакого беспорядка, создающего бесконечный индикатор выполнения.
Ответ 5 · рейтинг 1 · Colyn Jonker
Это то, что сработало для меня. Я создаю для вас неопределенный индикатор прогресса. Добавьте пользовательский элемент управления в свой проект/форму и вставьте этот код:
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;
}
Ответ 6 · Davy8
Может быть лучший способ, но один из способов - просто установить значение обратно на 0, когда оно достигнет конца (при условии, что ваша задача не завершена)