我在表单底部有一个网格控件,如果用户想要显示/隐藏它,它可以显示或隐藏。因此,一种方法是很好地使用表单的AutoSize并将该网格的Visuble属性更改为true或false,... 但我想我们让它变得更酷!所以我希望表单能够更慢地调整大小,就像车库门一样!所以我在表格上放了一个计时器,并在计时器滴答声时开始逐渐增加表格的高度......
当用户说显示/隐藏网格时,就是这样:
timer1.Enabled = true;
timer1.Start();
在timer_click事件中等等:
this.Height = this.Height + 5;
if(this.Height -10 > ErrorsGrid.Bottom )
timer1.Stop();
它有点有效,但仍然不完美。例如,它在一开始就滞后,停止调整大小,然后再开始调整大小......所以现在考虑到这个想法,你建议我应该做些什么改变以使这个东西看起来更好看?
答案 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();
}
}