2009-03-11 5 views
10

Je ne sais pas combien de temps une action peut prendre et je veux afficher une barre de progression à l'utilisateur dans une boîte de dialogue. J'ai essayé using System.Windows.Forms.ProgressBar mais il ne semble pas le soutenir.Comment puis-je créer une barre de progression infinie dans WinForms?

Un exemple de ce que je voudrais est la barre de progression que Windows vous montre quand il cherche de nouveaux pilotes sur Internet. Il y a juste trois ou quatre barres qui vont et viennent dans le style de la barre de progression.

Comment est-ce que je peux faire ceci?

Répondre

24

System.Windows.Forms.ProgressBar possède une propriété appelée Style. En réglant Style sur Marquee, vous obtiendrez l'effet recherché.

EDIT:Divo points sur le Marquee Style est disponible uniquement sur

Windows XP Édition familiale, Windows XP Professionnel Édition x64, Windows Server 2003

Les commentaires offrent encore plus d'informations indiquant que cela semble fonctionner partout aussi longtemps que vous utilisez .NET 2.0 ou supérieur.

+0

Semble Microsoft ne peut pas lâcher « chapiteau » entièrement. :-D – Tomalak

+4

Faites que "Windows XP ou supérieur". Je viens de tester sur Windows Vista et Windows 7 Beta (64 bits, cependant) et cela a fonctionné. – Joey

+0

Remarque: Il s'agit d'une fonctionnalité .NET 2.0+. .NET 1.1 n'a pas exposé la propriété de style. –

7

Avez-vous essayé de définir la propriété Style du System.Windows.Forms.ProgressBar sur Marquee?

Cependant, de façon surprenante, cette propriété est uniquement disponible sur les plates-formes suivantes (selon MSDN):

Windows XP Édition familiale, Windows XP Professionnel Édition x64, Windows Server 2003

Puissance Soit que la documentation n'a pas été mise à jour pour Vista. Quelqu'un sait-il une limitation sur Vista?

EDIT: Comme signalé dans un autre commentaire, la documentation semble être fausse en ce qui concerne les plates-formes prises en charge. Devrait fonctionner sur Vista ainsi que Windows 7.

0

Il pourrait y avoir une meilleure façon, mais on est juste de mettre en valeur à 0 quand il atteint la fin (en supposant que votre tâche est pas terminée)

+5

Je ressens une douleur physique chaque fois que je vois un programme faisant cela. D'un point de vue de l'utilisabilité, c'est l'une des pires choses qu'un programmeur paresseux peut faire. C'est une information non informative, erronée, distrayante, ennuyante et qui diminue la confiance des utilisateurs dans la «barre de progression» - la métaphore dans son ensemble. Même pas de barre de progression du tout, c'est mieux. – Tomalak

+0

D'accord. Probablement la meilleure solution pour un processus de longue haleine pour lequel aucune information de progrès ne peut jamais être obtenue (la question était un peu floue), ne serait pas une barre de progression du tout ... mais bon, il a demandé comment obtenir un indéterminé: – Joey

+0

On dirait que j'ai mal interprété l'effet désiré. C'était la seule barre de progression infinie dont je pouvais me souvenir du haut de ma tête. – Davy8

1

J'ai trouvé la solution de Chris Lawl la meilleure, très bonne et propre solution juste inclure un gif http://www.ajaxload.info/ et aucun désordre créant la barre de progression sans fin.

+3

Pas de désordre créant une barre de progression sans fin? faire est de mettre l'animation de la marque à 0 une fois fini et définir la propriété Visible de la barre de progression à false. Ce n'est pas magique. – Houman

1

C'est ce qui a fonctionné pour moi. Je crée une barre de progression indéterminée pour vous. Ajouter un contrôle personnalisé à votre projet/formulaire et insérer ce code:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 

namespace AnimatedCustomControls 
{ 
    sealed class IndeterminateProgressbar : Control 
    { 
    private readonly List<int> positions = new List<int>(); 
    private readonly Timer tmrAnimation = new Timer {Interval = 5, Enabled = false}; 
    private readonly Timer tmrAddPosition = new Timer {Interval = 500, Enabled = true}; 


    public Color ProgressColor { get; set; } 
    public Color InactiveColor { get; set; } 

    public IndeterminateProgressbar() 
    { 
     DoubleBuffered = true; 
     SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 
     ProgressColor = Color.FromArgb(40, 190, 245); 
     InactiveColor = Color.FromArgb(40, 40, 40); 
     tmrAnimation.Tick += tmrAnimation_Tick; 
     tmrAddPosition.Tick += tmrAddPosition_Tick; 
     if (!DesignMode) tmrAnimation.Start(); 
    } 

    void tmrAddPosition_Tick(object sender, EventArgs e) 
    { 
     positions.Add(1); 
    } 

    void tmrAnimation_Tick(object sender, EventArgs e) 
    { 
     if (DesignMode) tmrAnimation.Stop(); 
     for (int i = 0; i < positions.Count; i++) 
     { 
      positions[i] += 2 + Math.Abs(positions[i])/50; 
      if (positions[i] > Width) positions.RemoveAt(i); 
     } 
     Invalidate(); 
    } 

    protected override void OnEnabledChanged(EventArgs e) 
    { 
     base.OnEnabledChanged(e); 
     if (Enabled) 
     { 
      positions.Clear(); 
      positions.AddRange(new[] { Width/10, Width/3, Width/2, (int)(Width * 0.7) }); 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     if (Enabled) 
     { 
      e.Graphics.Clear(BackColor); 
      foreach (int i in positions) 
      { 
       e.Graphics.DrawLine(new Pen(Brushes.Black, 4f), i, 0, i, Height); 
      } 
     } 
     else e.Graphics.Clear(InactiveColor); 

     base.OnPaint(e); 
    } 
} 

}

Vous devriez alors construire votre solution et quand vous revenez au concepteur, le nouveau contrôle doit être dans votre boîte à outils .Faites-le glisser dans votre formulaire, définissez la valeur maximale et minimale et c'est tout.

J'ai créé un exemple de programme pour vous faire savoir comment il est utilisé:

 private void Form1_Load(object sender, EventArgs e) 
    { 
     indeterminateProgressbar1.BackColor = Color.FromArgb(40, 190, 245); //it's an nice color ;) 
     indeterminateProgressbar1.Size = new Size(400, 4); //make it small in the height looks better 
     indeterminateProgressbar1.Visible = true; 
    } 
Questions connexes