C# 两种字体样式更改之间的延迟环

C# 两种字体样式更改之间的延迟环,c#,.net,user-interface,C#,.net,User Interface,我想在短时间内更改控件的字体样式。例如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); label1.Font=新字体(label1.Font,label1.Font.St

我想在短时间内更改控件的字体样式。例如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);
label1.Font=新字体(label1.Font,label1.Font.Style | FontStyle.Bold);

对于(inti=0,i这不是等待两秒钟的方式。请尝试
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); 
要了解您的版本不起作用的原因,请查看


请注意,这将使您的用户界面冻结两秒钟。您应该尽量避免这种情况。请查看Timer类。

正如Jens所说,睡眠比“繁忙循环”要好得多

a) 编译器可能会对该循环进行优化
b) 在忙着等待时,表单无法更新自身以显示第一种字体


在等待之前,您可能还需要一个
.Refresh()
,以强制表单(或标签)重新绘制自身。

这个扩展函数怎么样

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;
    }
}
在写这个扩展时,我想到了另一个有趣的问题:

在这里,我回答了类似的问题

我更喜欢使用委托和
BeginInvoke()
函数


带有
计时器的变量
更容易理解,并且不需要从另一个线程访问控件。

Thread.Sleep()函数将窗体冻结太久。这是个坏主意。@Hesam Qodsi:+1个初学者问题,但很有用。