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
c#
winforms
progress-bar
Mark Stahler
quelle
quelle
Antworten:
Verwenden Sie einen Fortschrittsbalken mit dem Stil "eingestellt"
Marquee
. Dies ist ein unbestimmter Fortschrittsbalken.Sie können die
MarqueeAnimationSpeed
Eigenschaft auch verwenden, um festzulegen, wie lange der kleine Farbblock benötigt, um über Ihren Fortschrittsbalken zu animieren.quelle
Marquee
wird der nicht gerendert. Um die Verwendung zu ermöglichenApplication.EnableVisualStyles();
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;
quelle
MarqueeAnimationSpeed
wenn 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.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.
quelle
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(); } } }
quelle
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).
quelle
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).
quelle
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 :-)
quelle