it-swarm.dev

Cómo implementar una etiqueta parpadeante en un formulario

Tengo un formulario que muestra la cola de mensajes y el número de mensajes que se pueden cambiar. Realmente quiero parpadear la etiqueta (longitud de la cola) cuando se aumentó el número de mensajes para mejorar la usabilidad del formulario. ¿Debo implementar un control personalizado y usar hilo o temporizador adicional para cambiar el color de la etiqueta? ¿Alguien ha implementado esa funcionalidad? ¿Cuál es la mejor solución (menos recursos y menos degradación del rendimiento) para implementar ese comportamiento?

SOLUCIÓN:

Componente del formulario con temporizador que puede restringir el número de animaciones por segundo e implementar el efecto de desvanecimiento al color de fondo del control externo.

14
garik

Puede crear componentes y eventos personalizados para comenzar a parpadear. Creo que es una buena solución. Parpadeando puede implementar con temporizador.

2
Sergey Vedernikov

Lo siguiente parpadea usando async y await

private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}
24
MusuNaji
Timer timer = new Timer();
timer.Interval = 500;
timer.Enabled = false;

timer.Start();

if( messagesNum > oldMessagesNum)
  timer.Tick += new EventHandler( timer_Tick );
else
  timer.Tick -= timer_Tick;

void timer_Tick( object sender, EventArgs e )
{
   if(messageLabel.BackColor == Color.Black)
      messageLabel.BackColor = Color.Red;
   else
      messageLabel.BackColor = Color.Black;
}

Aquí hay una implementación bastante simple que funcionaría dentro de su formulario. También puede crear un control personalizado con el mismo código y simplemente lanzar la Timer.Start() en un método para ese control.

14
user501211

Sé que esta es una publicación muy antigua, pero cualquiera que busque algo un poco más versátil que las soluciones booleanas publicadas puede aprovechar algo de lo siguiente: enter image description here

using System.Diagnostics;
using System.Threading.Tasks;

private async void SoftBlink(Control ctrl, Color c1, Color c2, short CycleTime_ms, bool BkClr)
{
    var sw = new Stopwatch(); sw.Start();
    short halfCycle = (short)Math.Round(CycleTime_ms * 0.5);
    while (true)
    {
        await Task.Delay(1);
        var n = sw.ElapsedMilliseconds % CycleTime_ms;
        var per = (double)Math.Abs(n - halfCycle) / halfCycle;
        var red = (short)Math.Round((c2.R - c1.R) * per) + c1.R;
        var grn = (short)Math.Round((c2.G - c1.G) * per) + c1.G;
        var blw = (short)Math.Round((c2.B - c1.B) * per) + c1.B;
        var clr = Color.FromArgb(red, grn, blw);
        if (BkClr) ctrl.BackColor = clr; else ctrl.ForeColor = clr;
    }
}

A lo que puedes llamar así:

SoftBlink(lblWarning, Color.FromArgb(30, 30, 30), Color.Red,2000,false);
SoftBlink(lblSoftBlink, Color.FromArgb(30, 30, 30), Color.Green, 2000,true);
13
Jim Simson

¿Puedes usar una animación .gif en su lugar (tal vez como el fondo del número)? lo haría parecer páginas web de la vieja escuela, pero podría funcionar.

3
vlad

Cree su propio UserControl para esto, uno que herede de Label en lugar de Control directamente. Agregue un método StartBlinking, en el que inicie un objeto Timer cuyo evento tick altera el estilo de la etiqueta (cambiando las propiedades BackgroundColor y ForegroundColor cada vez para crear el efecto de parpadeo).

También puede agregar un método StopBlinking para desactivarlo, o puede hacer que su Timer se detenga después de 5 segundos, tal vez.

3
MusiGenesis

Puede usar la clase Timer aquí. Aquí lo que he implementado. El color de la etiqueta parpadea en el evento Button_click.

//click event on the button to change the color of the label
public void buttonColor_Click(object sender, EventArgs e)
        {
            Timer timer = new Timer();
            timer.Interval = 500;// Timer with 500 milliseconds
            timer.Enabled = false;

            timer.Start();

            timer.Tick += new EventHandler(timer_Tick);
        }

       void timer_Tick(object sender, EventArgs e)
    {
        //label text changes from 'Not Connected' to 'Verifying'
        if (labelFirst.BackColor == Color.Red)
        {
            labelFirst.BackColor = Color.Green;
            labelFirst.Text = "Verifying";
        }

        //label text changes from 'Verifying' to 'Connected'
        else if (labelFirst.BackColor == Color.Green)
        {
            labelFirst.BackColor = Color.Green;
            labelFirst.Text = "Connected";
        }

        //initial Condition (will execute)
        else
        {
            labelFirst.BackColor = Color.Red;
            labelFirst.Text = "Not Connected";
        }
    }
0
Parag555