Me doy cuenta de que hay otras preguntas sobre SO con respecto a las animaciones y barras de progreso, pero parecen girar en torno a deshacerse de la animación dibujada en la parte superior de la barra de progreso, es decir. lo más destacado que viaja sobre él.¿Desactivar la animación de la barra de progreso de .NET al cambiar el valor?
Lo que quiero hacer es deshacerme de la animación que se utiliza cuando establezco el nuevo valor de la barra de progreso. El problema que tengo ahora es que la acción que se está ejecutando se completa y luego la barra de progreso continúa aumentando hasta su posición máxima después de que haya completado la acción.
En otras palabras, si configuro la propiedad Value de la barra de progreso en 50, quiero que pase a la posición intermedia (si max es 100) inmediatamente, no construya lentamente la barra de progreso en esa posición como lo hace ahora .
Si de hecho hay una pregunta sobre SO que ya se refiere a esto, simplemente ciérrela como duplicada y lo eliminaré felizmente, pero no pude encontrar ninguna.
Este es el que encontré: Disabling WinForms ProgressBar animation, y se trata de lo más destacado que está animado, y eso no es de lo que estoy hablando.
Aquí es un simple LINQPad demostración que muestra el problema:
void Main()
{
using (var fm = new Form())
{
var bt = new Button
{
Text = "Start",
Location = new Point(8, 8),
Parent = fm,
};
var pb = new ProgressBar
{
Top = bt.Top + bt.Height + 8,
Width = fm.ClientRectangle.Width - 16,
Left = 8,
Parent = fm
};
bt.Click += (s, e) =>
{
bt.Enabled = false;
Thread t = new Thread(new ThreadStart(() =>
{
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Value = 50; }));
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Value = 100; }));
bt.BeginInvoke(new Action(() => { bt.Enabled = true; }));
}));
t.Start();
};
fm.ShowDialog();
}
}
Edición 1: Este es Windows 7, Tema de vidrio, así que sí, apuesto a que es específica a 7 o posiblemente también Vista.
Aquí hay una animación GIF que muestra el problema, el proyecto de arriba. Puede ver que tan pronto como se habilita el botón, 1 segundo después de que se ha establecido la marca de la mitad, la barra de progreso se anima hasta 100%, después de el botón se ha habilitado.
Como puede ver arriba, al volver a configurar el botón y configurar la barra de progreso en 100 se realiza "al mismo tiempo". Básicamente, no quiero la acumulación progresiva de la barra de progreso, quiero que salte directamente al 50% y luego al 100% al mismo tiempo que se habilita el botón.
Edición 2: En respuesta a la respuesta de David Heffernan, así es como he cambiado el código anterior:
bt.BeginInvoke(new Action(() => { pb.Value = 51; pb.Value = 50; }));
Thread.Sleep(1000);
bt.BeginInvoke(new Action(() => { pb.Maximum = 101; pb.Value = 101;
pb.Maximum = 100; pb.Value = 100; }));
Esto va inmediatamente a la marca a mitad de camino; no hay acumulación. En XP; puede ser específico del sistema operativo ¿estás en Vista/7? –
Esto es Windows 7, de 64 bits, déjame editar la pregunta y publicar una muestra de video. Además, gracias por agregar esa etiqueta :) –
Es gracioso, me encontré con este problema pensando que había una demora en mi código, ya que toma aproximadamente 100ms para que comience la animación. –