ProgressBar de Windows Forms: ¿la forma más fácil de iniciar / detener la marquesina?

79

Estoy usando C # y Windows Forms. Tengo una barra de progreso normal que funciona bien en el programa, pero ahora tengo otra operación en la que la duración no se puede calcular fácilmente. Me gustaría mostrar una barra de progreso, pero no sé cuál es la mejor manera de iniciar / detener el marco de desplazamiento. Esperaba algo tan simple como establecer la velocidad de la marquesina y luego comenzar () y detener (), pero no parece ser tan simple. ¿Tengo que ejecutar un bucle vacío en segundo plano? ¿Cuál es la mejor manera de hacer esto? Gracias

Mark Stahler
fuente
3
Aquí hay un buen artículo sobre
Matthew Lock

Respuestas:

114

Utilice una barra de progreso con el estilo establecido en Marquee. Esto representa una barra de progreso indeterminada.

myProgressBar.Style = ProgressBarStyle.Marquee;

También puede utilizar la MarqueeAnimationSpeedpropiedad para establecer cuánto tiempo tardará el pequeño bloque de color en animarse en la barra de progreso.

Paul Fisher
fuente
27
Si los 'Estilos visuales' no están habilitados, Marqueeno se renderizarán. Para habilitar el usoApplication.EnableVisualStyles();
Pooven
57

Para iniciar / detener la animación, debe hacer esto:

Para comenzar:

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

Para detener:

progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.MarqueeAnimationSpeed = 0;
Mo Patel
fuente
7
No es necesario configurarlo MarqueeAnimationSpeedal detenerlo y, al iniciarlo, generalmente tiene un valor razonable. No es necesario configurarlo cada vez que se inicia.
icktoofay
9

No es así como funcionan. Usted "inicia" una barra de progreso de estilo marquesina haciéndola visible, la detiene ocultándola. Puede cambiar la propiedad Style.

Hans Passant
fuente
8

Este código es parte de un formulario de inicio de sesión donde los usuarios esperan a que responda el servidor de autenticación.

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

Hay un buen artículo con código sobre este tema en MSDN. Supongo que establecer la propiedad Style en ProgressBarStyle.Marquee no es apropiado (¿o es eso lo que está tratando de controlar? No creo que sea posible detener / iniciar esta animación, aunque puede controlar la velocidad como indica @Paul).

tvanfosson
fuente
2

Ya hay muchas buenas respuestas aquí, aunque también debe tener en cuenta que si está haciendo un procesamiento de larga duración en el hilo de la interfaz de usuario (generalmente una mala idea), tampoco verá que el marco se mueva.

Uno sin nombre
fuente
-3

puede utilizar un temporizador (System.Windows.Forms.Timer).

Enganche su evento Tick, avance y luego barra de progreso hasta que alcance el valor máximo. cuando lo haga (llegue al máximo) y no haya terminado el trabajo, restablezca el valor de la barra de progreso al mínimo.

... como el Explorador de Windows :-)

Asher
fuente
2
Esta es una violación de "No reiniciar el progreso". y mala UI / UX. Ver: msdn.microsoft.com/en-us/library/windows/desktop/…
urbanhusky