我有一个表格,显示队列的消息和号码,这条消息可以改变。真的我想 Flink 标签(队列长度)。我是否应该实现自定义控件,并使用额外的线程或计时器来更改标签的颜色?是否有人实现了这样的功能?实现这样的行为的最佳解决方案是什么(减少资源和性能下降)?
带有计时器的窗体组件,该计时器可以限制每秒的动画数并对外部控件背景色实现淡出效果。
tsm1rwdh1#
以下内容使用async和await Flink
async
await
private async void Blink(){ while (true){ await Task.Delay(500); label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red; } }
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);
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()放入该控件的方法中。
Timer.Start()
pb3s4cty4#
为此创建您自己的UserControl,该UserControl继承自Label,而不是直接继承自Control。添加StartBlinking方法,在该方法中启动Timer对象,该对象的tick事件更改标签的样式(每次更改BackgroundColor和ForegroundColor属性以创建 Flink 效果)。您还可以添加一个StopBlinking方法来关闭它,或者您可以让Timer在5秒后自行停止。
UserControl
Label
Control
StartBlinking
Timer
StopBlinking
crcmnpdw5#
你可以创建一个定制的组件和事件来启动 Flink --我认为这是一个很好的解决方案。 Flink 可以用一个计时器来实现。
brgchamk6#
你能用一个动画的.gif来代替吗(也许作为数字的背景)?这会使它看起来像老式的网页,但它可能会起作用。
.gif
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"; } }
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; } } }
8条答案
按热度按时间tsm1rwdh1#
以下内容使用
async
和await
Flinkhsvhsicv2#
我知道这是一个很老的帖子,但是任何想寻找比布尔解更通用的东西的人都可以从下面的帖子中得到一些用处:
你可以这样称呼它:
kmb7vmvb3#
这是一个非常简单的实现,可以在表单中使用,你也可以用同样的代码创建一个自定义控件,只需要将
Timer.Start()
放入该控件的方法中。pb3s4cty4#
为此创建您自己的
UserControl
,该UserControl
继承自Label
,而不是直接继承自Control
。添加StartBlinking
方法,在该方法中启动Timer
对象,该对象的tick事件更改标签的样式(每次更改BackgroundColor和ForegroundColor属性以创建 Flink 效果)。您还可以添加一个
StopBlinking
方法来关闭它,或者您可以让Timer
在5秒后自行停止。crcmnpdw5#
你可以创建一个定制的组件和事件来启动 Flink --我认为这是一个很好的解决方案。 Flink 可以用一个计时器来实现。
brgchamk6#
你能用一个动画的
.gif
来代替吗(也许作为数字的背景)?这会使它看起来像老式的网页,但它可能会起作用。2q5ifsrm7#
你可以在这里使用
Timer
类。这里是我实现的。标签颜色在Button_click事件上 Flink 。soat7uwm8#
这就是我最后的结局