web-dev-qa-db-fra.com

Barre de progression Windows Forms: le moyen le plus simple de démarrer / arrêter un rectangle de sélection?

J'utilise C # et Windows Forms. J'ai une barre de progression normale qui fonctionne bien dans le programme, mais maintenant, j'ai une autre opération où la durée ne peut pas être facilement calculée. J'aimerais afficher une barre de progression, mais je ne connais pas le meilleur moyen de démarrer/arrêter le défilement. J'espérais quelque chose d'aussi simple que de définir la vitesse du rectangle de sélection, puis de démarrer start () et stop (), mais cela ne semble pas si simple. Dois-je exécuter une boucle vide en arrière-plan? Comment puis-je le faire au mieux? Merci

71
Mark Stahler

Utilisez une barre de progression avec le style défini sur Marquee. Cela représente une barre de progression indéterminée.

myProgressBar.Style = ProgressBarStyle.Marquee;

Vous pouvez également utiliser la propriété MarqueeAnimationSpeed pour définir le temps qu’il faudra au petit bloc de couleurs pour s’animer sur la barre de progression.

106
Paul Fisher

Pour démarrer/arrêter l'animation, procédez comme suit:

Commencer:

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

Arrêter:

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

Ce n'est pas comment ils fonctionnent. Vous "démarrez" une barre de progression de style Marquee en la rendant visible, vous l'arrêtez en la masquant. Vous pouvez changer la propriété Style.

9
Hans Passant

Ce code fait partie d'un formulaire de connexion dans lequel les utilisateurs attendent que le serveur d'authentification réponde.

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

Il y a un Nice article avec le code sur ce sujet sur MSDN. Je suppose que la définition de la propriété Style sur ProgressBarStyle.Marquee n'est pas appropriée (ou est-ce ce que vous essayez de contrôler? - Je ne pense pas qu'il soit possible d'arrêter/démarrer cette animation bien que vous puissiez contrôler la vitesse comme @Paul l’indique).

2
tvanfosson

Beaucoup de bonnes réponses ici déjà, même si vous devez également garder à l'esprit que si vous effectuez un traitement de longue durée sur le thread d'interface utilisateur (généralement une mauvaise idée), vous ne verrez pas non plus le rectangle de sélection bouger.

1
Nameless One