2

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

所以当用户说显示/隐藏网格时是这样的:

    timer1.Enabled = true;
    timer1.Start();

在 timer_click 事件中是这样的:

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

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

4

1 回答 1

5

尝试使用 aSystem.Timers.Timer代替。您可以在此处阅读有关可用 .net 计时器之间差异的更多信息,但我认为您的问题归结为:

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

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

例子:

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();
    }
}
于 2012-06-05T23:14:29.917 回答