winforms 如何在窗体上实现 Flink 标签

mfpqipee  于 2023-01-21  发布在  Flink
关注(0)|答案(8)|浏览(191)

我有一个表格,显示队列的消息和号码,这条消息可以改变。真的我想 Flink 标签(队列长度)。我是否应该实现自定义控件,并使用额外的线程或计时器来更改标签的颜色?是否有人实现了这样的功能?实现这样的行为的最佳解决方案是什么(减少资源和性能下降)?

    • 解决方案:**

带有计时器的窗体组件,该计时器可以限制每秒的动画数并对外部控件背景色实现淡出效果。

tsm1rwdh

tsm1rwdh1#

以下内容使用asyncawait Flink

private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}
hsvhsicv

hsvhsicv2#

我知道这是一个很老的帖子,但是任何想寻找比布尔解更通用的东西的人都可以从下面的帖子中得到一些用处:

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;
    }
}

你可以这样称呼它:

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

kmb7vmvb3#

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;
}

这是一个非常简单的实现,可以在表单中使用,你也可以用同样的代码创建一个自定义控件,只需要将Timer.Start()放入该控件的方法中。

pb3s4cty

pb3s4cty4#

为此创建您自己的UserControl,该UserControl继承自Label,而不是直接继承自Control。添加StartBlinking方法,在该方法中启动Timer对象,该对象的tick事件更改标签的样式(每次更改BackgroundColor和ForegroundColor属性以创建 Flink 效果)。
您还可以添加一个StopBlinking方法来关闭它,或者您可以让Timer在5秒后自行停止。

crcmnpdw

crcmnpdw5#

你可以创建一个定制的组件和事件来启动 Flink --我认为这是一个很好的解决方案。 Flink 可以用一个计时器来实现。

brgchamk

brgchamk6#

你能用一个动画的.gif来代替吗(也许作为数字的背景)?这会使它看起来像老式的网页,但它可能会起作用。

2q5ifsrm

2q5ifsrm7#

你可以在这里使用Timer类。这里是我实现的。标签颜色在Button_click事件上 Flink 。

//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";
        }
    }
soat7uwm

soat7uwm8#

这就是我最后的结局

public partial class MemberDisplay : Form
{
    public string Input;
    public int MASS_STOP = 1;

    public MemberDisplay(string msg)
    {
        InitializeComponent();
        State_Entry();
        Input = msg;
    }

    public void State_Entry()
    {
        this.SpecialFocus.Select();
        this.lbl_TimerTest.Hide();
    }

    private async void RunBlinkyTest(string msg)
    {
        while (msg == "GO" && (MASS_STOP == 0))
        {
            await Task.Delay(500);
            
            lbl_TimerTest.ForeColor =
                lbl_TimerTest.ForeColor == Color.Red ?
                    Color.Black :
                    Color.Red;

            if (msg == "STOP" && (MASS_STOP == 1)) { return; }
        }
    }

    private void btn_TimeTest_Click(object sender, EventArgs e)
    {
        if (btn_TimeTest.Text == "GO")
        {
            this.lbl_TimerTest.Show();
            MASS_STOP = 0;
            RunBlinkyTest("GO");
            btn_TimeTest.Text = "STOP";
            return;
        }

        if (btn_TimeTest.Text == "STOP")
        {
            MASS_STOP = 1;
            RunBlinkyTest("STOP");
            this.lbl_TimerTest.ForeColor = Color.Black;
            this.lbl_TimerTest.Hide();
            btn_TimeTest.Text = "GO";
            return;
        }
    }
}

相关问题