Pasek postępu formularzy Windows Forms: najłatwiejszy sposób na uruchomienie / zatrzymanie marquee?

79

Używam C # i Windows Forms. Mam normalny pasek postępu działający dobrze w programie, ale teraz mam inną operację, w której nie można łatwo obliczyć czasu trwania. Chciałbym wyświetlić pasek postępu, ale nie znam najlepszego sposobu na rozpoczęcie / zatrzymanie przewijania. Miałem nadzieję na coś tak prostego, jak ustawienie prędkości markizy, a następnie uruchomienie () i stop (), ale nie wydaje się to takie proste. Czy muszę uruchamiać pustą pętlę w tle? Jak najlepiej to zrobić? Dzięki

Mark Stahler
źródło
3
Oto fajny artykuł na temat wyboru typu paska postępu msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx
Matthew Lock

Odpowiedzi:

114

Użyj paska postępu ze stylem ustawionym na Marquee. Stanowi to nieokreślony pasek postępu.

myProgressBar.Style = ProgressBarStyle.Marquee;

Możesz również użyć tej MarqueeAnimationSpeedwłaściwości, aby ustawić, jak długo zajmie animacja małego bloku koloru na pasku postępu.

Paul Fisher
źródło
27
Jeśli „Style wizualne” nie są włączone, Marqueenie będą renderowane. Aby umożliwić korzystanieApplication.EnableVisualStyles();
Pooven
57

Aby rozpocząć / zatrzymać animację, wykonaj następujące czynności:

Zacząć:

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

Zatrzymać:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
Mo Patel
źródło
7
Nie musisz go ustawiać, MarqueeAnimationSpeedgdy go zatrzymujesz, a podczas uruchamiania ma zwykle rozsądną wartość. Nie ma potrzeby ustawiania go za każdym razem przy uruchamianiu.
icktoofay
9

Nie chodzi o to, jak oni działają. Pasek postępu w stylu markizy „zaczynasz”, czyniąc go widocznym, a zatrzymujesz, ukrywając go. Możesz zmienić właściwość Style.

Hans Passant
źródło
8

Ten kod jest częścią formularza logowania, w którym użytkownicy czekają na odpowiedź serwera uwierzytelniania.

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();
        }
    }
}    
Arda Basoglu
źródło
2

W witrynie MSDN jest fajny artykuł z kodem na ten temat. Zakładam, że ustawienie właściwości Style na ProgressBarStyle.Marquee nie jest właściwe (lub czy to jest to, co próbujesz kontrolować? - Nie sądzę, aby można było zatrzymać / uruchomić tę animację, chociaż możesz kontrolować prędkość jak wskazuje @Paul).

tvanfosson
źródło
2

Wiele dobrych odpowiedzi jest już tutaj, chociaż musisz również pamiętać, że jeśli wykonujesz długotrwałe przetwarzanie w wątku interfejsu użytkownika (ogólnie zły pomysł), wtedy również nie zobaczysz, że marquee się porusza.

Bezimienny
źródło
-3

możesz użyć Timera (System.Windows.Forms.Timer).

Zahacz to wydarzenie Tick, przesuwaj pasek postępu, aż osiągnie maksymalną wartość. gdy tak się stanie (osiągnął maksimum) i nie ukończyłeś zadania, zresetuj wartość paska postępu z powrotem do minimum.

... tak jak Windows Explorer :-)

Asher
źródło
2
Jest to naruszenie zasady „Nie uruchamiaj ponownie postępu”. i zły UI / UX. Zobacz: msdn.microsoft.com/en-us/library/windows/desktop/...
urbanhusky