Windows Forms ProgressBar: Найпростіший спосіб запустити / зупинити рамку?


79

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


3
Ось приємна стаття про вибір типу індикатора
Matthew Lock

Відповіді:


114

Використовуйте індикатор виконання зі стилем, встановленим на Marquee. Це являє собою невизначений бар прогресу.

myProgressBar.Style = ProgressBarStyle.Marquee;

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


27
Якщо "Візуальні стилі" не ввімкнено, Marqueeвін не відображатиметься. Щоб дозволити використанняApplication.EnableVisualStyles();
Пувен

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).


2

Тут уже є багато хороших відповідей, хоча вам також потрібно пам’ятати, що якщо ви виконуєте тривалу обробку потоку інтерфейсу користувача (як правило, це погана ідея), тоді ви не побачите, як шатер рухається.


-3

Ви можете використовувати таймер (System.Windows.Forms.Timer).

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

... так само, як Провідник Windows :-)


2
Це порушення "Не перезавантажувати прогрес". і поганий UI / UX. Див .: msdn.microsoft.com/en-us/library/windows/desktop/…
urbanhusky
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.