我有两个表格。在主窗体中,我有一个按钮,它调用另一个窗体的构造函数。在表单加载后,我需要它自动调用一个函数,该函数将在某个方向上移动此表单。我很难找到一个事件来做这项工作,因为像加载或显示的事件是在表单实际“显示”之前执行的……这意味着移动窗体的循环在窗体出现之前就完成了,并且窗体显示在最终位置。有人知道窗体可见后触发的事件吗?或者知道这个问题的另一个解决方案?
关于另一个主题,我读到过关于显示的事件,但不幸的是它的行为与Load事件相同,我不明白为什么:(我只有一个解决方案,它是创建第二个线程,延迟500ms (这应该足以加载表单),它将启动move()方法,但我不知道如何调用在不同线程上创建的函数:( ...线程将与move()方法同时结束。
命名为Title的第二个表单:
public partial class Title : Form
{
public Title()
{
InitializeComponent();
this.Left = (Screen.AllScreens[0].Bounds.Width + Screen.AllScreens[1].Bounds.Width / 2 - this.Width / 2);
this.Top = (Screen.AllScreens[1].Bounds.Height-80);
}
// metod moves form
public void move()
{
while (this.Top > 400)
{
this.Top--;
Thread.Sleep(1);
}
}
// another button closes this form with reverse move animation - this works fine
public void Destruct()
{
while (this.Top < (Screen.AllScreens[1].Bounds.Height - 80))
{
this.Top++;
Thread.Sleep(1);
}
this.Close();
}
private void Title_Shown(object sender, EventArgs e)
{
move();
}
}解决方案我在循环中使用Windows.Timer而不是Thread.Sleep()。
发布于 2011-07-19 02:27:01
看起来你要创造一种慢飞的效果。我建议您使用计时器,而不是使用Thread.Sleep()循环。您可以在事件中创建和启用计时器。在计时器的每一次滴答之后,你都会将窗口移动一点。在它到达结束位置后,您只需禁用计时器(Enabled=false)即可。您可以使用工具箱中的计时器控件。
https://stackoverflow.com/questions/6737382
复制相似问题