Отключение анимации индикатора выполнения .NET при изменении значения?

Я понимаю, что есть и другие вопросы по SO, касающиеся анимации и индикаторов выполнения, но они, кажется, вращаются вокруг избавления от анимации, нарисованной поверх индикатора выполнения, т.е. выделение, которое проходит по нему.

Я хочу избавиться от анимации, которая используется, когда я устанавливаю новое значение индикатора выполнения. Проблема, с которой я столкнулся сейчас, заключается в том, что выполняемое действие завершается, а затем индикатор выполнения продолжает увеличиваться до максимального значения после , действие завершено.

Другими словами, если я установил значение Value для свойства progressbar на 50, я хочу, чтобы он сразу переместился в половину позиции (если max равен 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 выполняется «одновременно». В принципе, мне не нужно прогрессивное нарастание индикатора выполнения, я хочу, чтобы он сразу перескакивал на 50%, а затем на 100% одновременно с включением кнопки.

LINQPad demo


Редактировать 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; }));

21
задан Community 23 May 2017 в 12:34
поделиться