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


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.


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;

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.


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();
        }
    }
}    

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


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.