两种字体样式之间的延迟环改变

时间:2010-04-06 08:38:03

标签: 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);

但它不起作用。问题是什么?

4 个答案:

答案 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。