使用计时器事件,表单不会顺利调整大小

时间:2012-06-05 22:36:16

标签: c# winforms

我在表单底部有一个网格控件,如果用户想要显示/隐藏它,它可以显示或隐藏。因此,一种方法是很好地使用表单的AutoSize并将该网格的Visuble属性更改为true或false,... 但我想我们让它变得更酷!所以我希望表单能够更慢地调整大小,就像车库门一样!所以我在表格上放了一个计时器,并在计时器滴答声时开始逐渐增加表格的高度......

当用户说显示/隐藏网格时,

就是这样:

    timer1.Enabled = true;
    timer1.Start();
在timer_click事件中

等等:

    this.Height = this.Height + 5;
    if(this.Height -10 > ErrorsGrid.Bottom )
        timer1.Stop();

它有点有效,但仍然不完美。例如,它在一开始就滞后,停止调整大小,然后再开始调整大小......所以现在考虑到这个想法,你建议我应该做些什么改变以使这个东西看起来更好看?

1 个答案:

答案 0 :(得分:5)

尝试使用System.Timers.Timer代替。您可以详细了解可用的.net计时器here之间的差异,但我认为您的问题归结为:

  

此计时器类引发的“[System.Windows.Forms.Timer]事件与...同步   尊重Windows窗体应用程序中的其余代码。这意味着   正在执行的应用程序代码永远不会被抢占   这个计时器类的实例......“

这对System.Timers.Timer不会有问题。只需确保将该对象的SynchronizingObject设置为您的表单,以便在UI线程上执行已发生的事件。

示例:

public partial class Form1 : Form
{
    System.Timers.Timer timer = new System.Timers.Timer(100);

    public Form1()
    {
        InitializeComponent();

        timer.AutoReset = true;
        timer.SynchronizingObject = this;
        timer.Elapsed += timer_Elapsed;
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        this.Height += 5;

        if (this.Height -10 > ErrorsGrid.Bottom)
            timer.Stop();
    }

    void button1_Click(object sender, EventArgs e)
    {
        timer.Start();
    }
}