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
c#
winforms
progress-bar
Mark Stahler
fuente
fuente
Respuestas:
Utilice una barra de progreso con el estilo establecido en
Marquee
. Esto representa una barra de progreso indeterminada.También puede utilizar la
MarqueeAnimationSpeed
propiedad para establecer cuánto tiempo tardará el pequeño bloque de color en animarse en la barra de progreso.fuente
Marquee
no se renderizarán. Para habilitar el usoApplication.EnableVisualStyles();
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;
fuente
MarqueeAnimationSpeed
al detenerlo y, al iniciarlo, generalmente tiene un valor razonable. No es necesario configurarlo cada vez que se inicia.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.
fuente
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(); } } }
fuente
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).
fuente
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.
fuente
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 :-)
fuente