Windows Forms ProgressBar: Einfachste Methode zum Starten / Stoppen von Laufschrift?


79

Ich verwende C # und Windows Forms. Ich habe einen normalen Fortschrittsbalken, der im Programm einwandfrei funktioniert, aber jetzt habe ich eine andere Operation, bei der die Dauer nicht einfach berechnet werden kann. Ich möchte einen Fortschrittsbalken anzeigen, weiß aber nicht, wie ich den Laufrahmen am besten starten / stoppen kann. Ich hatte auf etwas so Einfaches gehofft, wie die Festzeltgeschwindigkeit einzustellen und dann Start () und Stopp () zu haben, aber es scheint nicht so einfach zu sein. Muss ich im Hintergrund eine leere Schleife ausführen? Wie mache ich das am besten? Vielen Dank


3
Hier ist ein schöner Artikel über die Auswahl eines Fortschrittsbalkentyps msdn.microsoft.com/en-us/library/windows/desktop/aa511486.aspx
Matthew Lock

Antworten:


114

Verwenden Sie einen Fortschrittsbalken mit dem Stil "eingestellt" Marquee. Dies ist ein unbestimmter Fortschrittsbalken.

myProgressBar.Style = ProgressBarStyle.Marquee;

Sie können die MarqueeAnimationSpeedEigenschaft auch verwenden, um festzulegen, wie lange der kleine Farbblock benötigt, um über Ihren Fortschrittsbalken zu animieren.


27
Wenn die 'Visuellen Stile' nicht aktiviert sind, Marqueewird der nicht gerendert. Um die Verwendung zu ermöglichenApplication.EnableVisualStyles();
Pooven

57

Um die Animation zu starten / zu stoppen, sollten Sie Folgendes tun:

Anfangen:

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

Stoppen:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;

7
Sie müssen es nicht einstellen, MarqueeAnimationSpeedwenn Sie es stoppen, und wenn Sie es starten, hat es normalerweise einen vernünftigen Wert. Sie müssen es nicht jedes Mal beim Starten einstellen.
icktoofay

9

So funktionieren sie nicht. Sie "starten" einen Fortschrittsbalken im Laufschriftstil, indem Sie ihn sichtbar machen. Sie stoppen ihn, indem Sie ihn ausblenden. Sie können die Style-Eigenschaft ändern.


8

Dieser Code ist Teil eines Anmeldeformulars, in dem die Benutzer auf die Antwort des Authentifizierungsservers warten.

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

Es gibt einen schönen Artikel mit Code zu diesem Thema auf MSDN. Ich gehe davon aus, dass das Setzen der Style-Eigenschaft auf ProgressBarStyle.Marquee nicht angemessen ist (oder ist es das, was Sie steuern möchten? - Ich glaube nicht, dass es möglich ist, diese Animation zu stoppen / zu starten, obwohl Sie die Geschwindigkeit steuern können wie @Paul angibt).


2

Hier gibt es bereits viele gute Antworten, obwohl Sie auch bedenken müssen, dass sich das Festzelt auch nicht bewegt, wenn Sie eine lange Verarbeitung auf dem UI-Thread durchführen (im Allgemeinen eine schlechte Idee).


-3

Sie können einen Timer (System.Windows.Forms.Timer) verwenden.

Haken Sie das Tick-Ereignis ein, fahren Sie mit dem Fortschrittsbalken fort, bis der Maximalwert erreicht ist. Wenn dies der Fall ist (max.) und Sie den Job nicht beendet haben, setzen Sie den Wert des Fortschrittsbalkens auf das Minimum zurück.

... genau wie Windows Explorer :-)


2
Dies ist eine Verletzung von "Fortschritt nicht neu starten". und schlechte UI / UX. Siehe: msdn.microsoft.com/en-us/library/windows/desktop/…
urbanhusky
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.