Windows Forms ProgressBar: самый простой способ запустить / остановить выделение?

79

Я использую C # и Windows Forms. У меня в программе нормально работает индикатор выполнения, но теперь у меня есть еще одна операция, продолжительность которой не может быть легко рассчитана. Я хотел бы отобразить индикатор выполнения, но не знаю, как лучше всего запустить / остановить бегущую строку. Я надеялся на что-то простое, например, на установку скорости выделения, а затем на start () и stop (), но, похоже, это не так просто. Должен ли я запускать пустой цикл в фоновом режиме? Как мне лучше всего это сделать? благодаря

Марк Сталер
источник
3
Вот хорошая статья о выборе типа индикатора выполнения msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx
Мэтью Лок,

Ответы:

114

Используйте индикатор выполнения со стилем, установленным на Marquee. Это представляет собой неопределенный индикатор выполнения.

myProgressBar.Style = ProgressBarStyle.Marquee;

Вы также можете использовать это MarqueeAnimationSpeedсвойство, чтобы установить, сколько времени потребуется маленькому цветному блоку для анимации на вашем индикаторе выполнения.

Пол Фишер
источник
27
Если «Визуальные стили» не включены, Marqueeвизуализация не будет. Для включения использованияApplication.EnableVisualStyles();
Pooven
57

Чтобы запустить / остановить анимацию, необходимо сделать следующее:

Начать:

progressBar1.Style = ProgressBarStyle.Marquee;
progressBar1.MarqueeAnimationSpeed = 30;

Остановиться:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
Мо Патель
источник
7
Вам не нужно устанавливать MarqueeAnimationSpeedпри его остановке, и при запуске он обычно имеет разумное значение. Не нужно устанавливать его каждый раз при запуске.
icktoofay
9

Они работают не так. Вы «запускаете» индикатор выполнения в стиле выделения, делая его видимым, вы останавливаете его, скрывая. Вы можете изменить свойство Style.

Ганс Пассан
источник
8

Этот код является частью формы входа в систему, где пользователи ждут ответа сервера аутентификации.

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace LoginWithProgressBar
{
    public partial class TheForm : Form
    {
        // BackgroundWorker object deals with the long running task
        private readonly BackgroundWorker _bw = new BackgroundWorker();

        public TheForm()
        {
            InitializeComponent();

            // set MarqueeAnimationSpeed
            progressBar.MarqueeAnimationSpeed = 30;

            // set Visible false before you start long running task
            progressBar.Visible = false;

            _bw.DoWork += Login;
            _bw.RunWorkerCompleted += BwRunWorkerCompleted;
        }

        private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // hide the progress bar when the long running process finishes
            progressBar.Hide();
        }

        private static void Login(object sender, DoWorkEventArgs doWorkEventArgs)
        {
            // emulate long (3 seconds) running task
            Thread.Sleep(3000);
        }

        private void ButtonLoginClick(object sender, EventArgs e)
        {
            // show the progress bar when the associated event fires (here, a button click)
            progressBar.Show();

            // start the long running task async
            _bw.RunWorkerAsync();
        }
    }
}    
Арда Басоглу
источник
2

На MSDN есть хорошая статья с кодом по этой теме. Я предполагаю, что установка свойства Style в ProgressBarStyle.Marquee не подходит (или это то, что вы пытаетесь контролировать? - Я не думаю, что можно остановить / запустить эту анимацию, хотя вы можете контролировать скорость как указывает @Paul).

tvanfosson
источник
2

Здесь уже много хороших ответов, хотя вам также нужно иметь в виду, что если вы выполняете длительную обработку в потоке пользовательского интерфейса (как правило, плохая идея), вы также не увидите перемещения выделения.

Безымянный
источник
-3

вы можете использовать таймер (System.Windows.Forms.Timer).

Перехватите это событие Tick, продвиньтесь, затем индикатор выполнения, пока не достигнет максимального значения. когда это произойдет (достигнет максимума) и вы не закончили задание, сбросьте значение индикатора выполнения до минимального.

... как в проводнике Windows :-)

Ашер
источник
2
Это нарушение правила «Не перезапускать прогресс». и плохой UI / UX. См .: msdn.microsoft.com/en-us/library/windows/desktop/…
urbanhusky