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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用计时器事件,表单不会顺利调整大小相关的知识,希望对你有一定的参考价值。

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

当用户说显示/隐藏网格时,这样的事情:

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

以及timer_click事件中的类似内容:

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

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

答案

尝试使用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();
    }
}

以上是关于使用计时器事件,表单不会顺利调整大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在窗体调整大小时调整datagridview控件的大小

键盘打开时,带有片段的活动不会调整大小

iPad不会触发从垂直到水平的调整大小事件?

出现键盘后调整活动大小

C#表单,调整表单大小后,图像无法超出原始表单大小

UIPopOver、UITextView 和自动调整大小