我想在短时间内更改控件的字体样式。例如2秒。我喜欢:
label1.Font = new Font(label1.Font, label1.Font.Style | FontStyle.Bold);
for(int i=0,i<4000000,i++);
label1.Font = new Font(label1.Font, label1.Font.Style | FontStyle.Regular);
但它不起作用。问题是什么?
答案 0 :(得分:3)
这个扩展功能怎么样?
public static class LabelExtensions
{
public static Label BlinkText(this Label label, int duration)
{
Timer timer = new Timer();
timer.Interval = duration;
timer.Tick += (sender, e) =>
{
timer.Stop();
label.Font = new Font(label.Font, label.Font.Style ^ FontStyle.Bold);
};
label.Font = new Font(label.Font, label.Font.Style | FontStyle.Bold);
timer.Start();
return label;
}
}
在撰写此扩展程序时,我想到了另一个有趣的问题:
Does it lead to a memory leak?
答案 1 :(得分:0)
这不是等待两秒的方法。请改为System.Threading.Thread.Sleep(2000)
。
至于你的问题:当你说:“它不起作用”时,我认为字体保持粗体而不是返回常规。请改用:
FontStyle style = label1.Font.Style;
label1.Font = new Font(label1.Font, style | FontStyle.Bold);
System.Threading.Thread.Sleep(2000)
label1.Font = new Font(label1.Font, style);
要了解您的版本无效的原因,请查看MSDN documentation of the Enum type.
请注意,这会冻结您的用户界面两秒钟。你应该尽量避免这种情况。看看Timer类。
答案 2 :(得分:0)
正如Jens所说,Sleep
比你的'忙碌循环'要好得多。
a)编译器可以优化该循环 b)在忙碌等待时,表单无法自行更新以显示第一个Font。
在等待之前,您可能还需要.Refresh()
,以强制表单(或仅标签)重新绘制自己。
答案 3 :(得分:0)
我在这里回答了类似的问题。
.NET: Best way to execute a lambda on UI thread after a delay?
我更喜欢使用委托和BeginInvoke()
函数。
使用Timer
的变体更容易理解,无需从另一个线程访问Control。