Windows Forms ProgressBar: самый простой способ запустить / остановить выделение? - PullRequest
70 голосов
/ 23 ноября 2008

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

Ответы [ 7 ]

103 голосов
/ 24 ноября 2008

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

myProgressBar.Style = ProgressBarStyle.Marquee;

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

52 голосов
/ 03 марта 2009

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

Для начала:

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

Для остановки:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
9 голосов
/ 24 ноября 2008

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

8 голосов
/ 15 июля 2011

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

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 голосов
/ 24 ноября 2008

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

1 голос
/ 13 июля 2015

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

0 голосов
/ 23 ноября 2008

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

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

... так же, как Windows Explorer: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...