it-swarm.com.de

So implementieren Sie ein blinkendes Etikett in einem Formular

Ich habe ein Formular, das die Warteschlange der Nachrichten anzeigt und deren Anzahl geändert werden kann. Eigentlich möchte ich das Label (Warteschlangenlänge) blinken lassen, wenn die Anzahl der Nachrichten erhöht wurde, um die Formularverwendbarkeit zu verbessern. Soll ich eine benutzerdefinierte Steuerung implementieren und einen zusätzlichen Thread oder Timer verwenden, um die Labelfarbe zu ändern? Hat jemand so Funktionalität implementiert? Was ist die beste Lösung (weniger Ressourcen und weniger Leistungseinbußen), um dieses Verhalten zu implementieren?

LÖSUNG:

Formularkomponente mit Timer, der Anzahl der Animationen pro Sekunde einschränken kann und Ausblendeffekt auf externe Hintergrundfarbe des Steuerelements implementieren).

12
garik

Sie können benutzerdefinierte Komponenten und Ereignisse erstellen, um zu blinken. Ich finde eine gute Lösung. Blinkend können Sie mit Timer implementieren.

1

Folgendes blinkt mit async und await

private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}
21
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;
}

Hier ist eine ziemlich einfache Implementierung, die in Ihrem Formular funktionieren würde. Sie können auch ein benutzerdefiniertes Steuerelement mit demselben Code erstellen und einfach Timer.Start() in eine Methode für dieses Steuerelement werfen.

12
user501211

Ich weiß, dass dies ein wirklich alter Beitrag ist, aber jeder, der etwas vielseitiger als die von Boolean veröffentlichten Lösungen sucht, kann aus dem Folgenden Nutzen ziehen:  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;
    }
}

Was kannst du so nennen:

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

Können Sie stattdessen einen animierten .gif verwenden (vielleicht als Hintergrund für die Nummer)? Es würde aussehen wie alte Schulwebseiten, aber es könnte funktionieren.

2
vlad

Erstellen Sie hierfür Ihr eigenes UserControl, das von Label anstelle von Control direkt erbt. Fügen Sie eine StartBlinking-Methode hinzu, in der Sie ein Timer-Objekt starten, dessen Häkchenereignis den Stil der Beschriftung ändert (indem Sie die BackgroundColor- und ForegroundColor-Eigenschaften jedes Mal ändern, um den Blink-Effekt zu erzeugen).

Sie können auch eine StopBlinking-Methode hinzufügen, um sie auszuschalten, oder Sie könnten Ihre Timer-Funktion nach 5 Sekunden stoppen.

2
MusiGenesis

Sie können die Timer-Klasse hier verwenden. Hier ist das, was ich implementiert habe. Beschriftungsfarbe blinkt beim Button_click-Ereignis.

//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