2009-03-11 20 views
10

No sé cuánto tiempo podría tomar una acción y quiero mostrar una barra de progreso al usuario en un cuadro de diálogo. Intenté usar System.Windows.Forms.ProgressBar, pero parece que no lo admite.¿Cómo puedo hacer una barra de progreso sin fin en WinForms?

Un ejemplo de lo que me gustaría es la barra de progreso que Windows le muestra cuando está buscando nuevos controladores en Internet. Solo tiene tres o cuatro "barras" que van y vienen estilo marquesina en la barra de progreso.

¿Cómo puedo hacer esto?

Respuesta

24

System.Windows.Forms.ProgressBar tiene una propiedad llamada Style. Configuración Style a Marquee logrará el efecto que busca.

EDIT:Divo puntos sobre la marquesina Style sólo está disponible en

Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003

Los comentarios proporcionan aún más información indicando que esto parece funcionar en todas partes siempre que use .NET 2.0 o superior.

+0

Parece Microsoft no puede dejar de lado "carpa" en su totalidad. :-D – Tomalak

+4

Haga que "Windows XP o superior". Acabo de probar en Windows Vista y Windows 7 Beta (ambos de 64 bits, sin embargo) y funcionó. – Joey

+0

Nota: Esta es una característica .NET 2.0+. .NET 1.1 no expone la propiedad de estilo. –

7

¿Ha intentado establecer la propiedad Style del System.Windows.Forms.ProgressBar en Marquee?

Sin embargo, sorprendentemente, esta propiedad sólo está disponible en las siguientes plataformas (según MSDN):

Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003

Poder Sin embargo, la documentación no se ha actualizado a Vista. Alguien sabe acerca de una limitación en Vista?

EDITAR: Como se publicó en otro comentario, la documentación parece ser incorrecta con respecto a las plataformas admitidas. Debería estar trabajando en Vista, así como Windows 7.

0

podría haber una mejor manera, pero una forma es sólo para fijar el valor de nuevo a 0 cuando alcanza el final (asumiendo que su tarea no está completa)

+5

Siento dolor físico cada vez que veo un programa haciendo eso. Desde un punto de vista de usabilidad, esta es una de las peores cosas que un programador perezoso puede hacer. No informa, equivoca, distrae, molesta y disminuye la confianza del usuario en la "barra de progreso" -metaphor como un todo. Incluso ninguna barra de progreso en absoluto es mejor. – Tomalak

+0

De acuerdo. Probablemente la mejor solución para un proceso de larga duración para el que no se puede obtener información sobre el progreso (la pregunta era un poco confusa), no sería una barra de progreso en absoluto ... pero bueno, preguntó cómo obtener una respuesta indeterminada:) – Joey

+0

Parece que he leído mal el efecto deseado. Esa fue la única barra de progreso infinito que pude recordar en la cima de mi cabeza. – Davy8

1

Encontré que la solución de Chris Lawl es la mejor, muy buena y limpia solución, solo incluye un gif http://www.ajaxload.info/ y no crea problemas creando una barra de progreso interminable.

+3

¿No tienes problemas creando una barra de progreso interminable? hacer es establecer la animación de la marquesina en 0 una vez finalizada y establecer la propiedad Visible de la barra de progreso en falso. No es magia. – Houman

1

Esto es lo que funcionó para mí. Creo una barra de progreso indeterminada para ti. Añadir un control personalizado a su proyecto/formulario e inserte el código:

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

}

A continuación, debe construir su solución y cuando vuelva al diseñador, el nuevo control debe estar en su caja de herramientas .Arrástralo a tu forma, establece el valor máximo y mínimo, y eso es todo.

He creado un programa de ejemplo para saber cómo se utiliza:

 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; 
    } 
Cuestiones relacionadas