Я понимаю, что есть другие вопросы относительно SO относительно анимации и progressbars, но они, похоже, вращаются вокруг избавления от анимации, нарисованной поверх индикатора прогресса, т.е. который путешествует по ней.
Что я хочу сделать, так это избавиться от анимации, которая используется, когда я устанавливаю новое значение индикатора выполнения. Теперь проблема заключается в том, что выполняемое действие завершается, а затем индикатор выполнения продолжает увеличиваться до максимального положения после завершения действия.
Другими словами, если я установил свойство Value для панели прогресса на 50, я хочу, чтобы он сразу же переместился в половинное положение (если макс 100), а не медленно наращивал уровень прогресса до этой позиции, как сейчас.
Если на самом деле есть вопрос о SO, который уже имеет дело с этим, просто как дубликат, и я с радостью удалю его, но я не смог найти его.
Вот что я нашел: Отключение анимации WinForms ProgressBar, и она касается анимации, и это не то, о чем я говорю.
Здесь приведена простая демонстрация LINQPad, которая показывает проблему:
void Main()
{
using (var fm = new Form())
{
var bt = new Button
{
Text = "Start",
Location = new Point(8, 8),
Parent = fm,
};
var pb = new ProgressBar
{
Top = bt.Top + bt.Height + 8,
Width = fm.ClientRectangle.Width - 16,
Left = 8,
Parent = fm
};
bt.Click += (s, e) =>
{
bt.Enabled = false;
Thread t = new Thread(new ThreadStart(() =>
{
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Value = 50; }));
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Value = 100; }));
bt.BeginInvoke(new Action(() => { bt.Enabled = true; }));
}));
t.Start();
};
fm.ShowDialog();
}
}
Изменить 1: Это тема Windows 7, Glass, поэтому да, я уверен, что это характерно для 7 или, возможно, для Vista.
Здесь GIF-анимация, которая показывает проблему, проект сверху. Вы можете видеть, что как только кнопка будет включена, через 1 секунду после того, как была установлена отметка полумесяца, панель прогресса будет анимировать до 100% после того, как кнопка станет включена.
Как вы можете видеть выше, установка кнопки назад для включения и настройка панели прогресса на 100 выполняется "одновременно". В принципе, я не хочу прогрессивного наращивания progressbar, я хочу, чтобы он прыгал прямо на 50%, а затем до 100% одновременно с нажатием кнопки.
Изменить 2: Отвечая на ответ Дэвида Хеффернана, я изменил приведенный выше код:
bt.BeginInvoke(new Action(() => { pb.Value = 51; pb.Value = 50; }));
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Maximum = 101; pb.Value = 101;
pb.Maximum = 100; pb.Value = 100; }));