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
c#
winforms
progress-bar
Mark Stahler
źródło
źródło
Odpowiedzi:
Użyj paska postępu ze stylem ustawionym na
Marquee
. Stanowi to nieokreślony pasek postępu.Możesz również użyć tej
MarqueeAnimationSpeed
właściwości, aby ustawić, jak długo zajmie animacja małego bloku koloru na pasku postępu.źródło
Marquee
nie będą renderowane. Aby umożliwić korzystanieApplication.EnableVisualStyles();
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;
źródło
MarqueeAnimationSpeed
gdy go zatrzymujesz, a podczas uruchamiania ma zwykle rozsądną wartość. Nie ma potrzeby ustawiania go za każdym razem przy uruchamianiu.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.
źródło
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(); } } }
źródło
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).
źródło
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.
źródło
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 :-)
źródło