c# -窗体加载后移动
本文关键字:移动 加载 窗体 | 更新日期: 2023-09-27 18:02:46
我有两个表单。在主表单中,我有一个按钮,它调用另一个表单的构造函数。表单加载后,我需要它自动调用一个函数,这将在某些方向移动这个表单。我很难找到事件,这将做的工作,因为像加载或显示事件执行形式之前实际上是"显示"…这意味着移动表单的循环在表单出现之前就完成了,并且表单显示在最终位置。有人知道事件触发后的形式是可见的吗?或者知道解决这个问题的其他方法吗?
在另一个主题上,我读过关于显示事件,但不幸的是它的行为与加载事件相同,我不明白为什么:(只有一个解决方案,我记住它创建第二个线程与500ms延迟(这应该足以加载表单),这将开始移动()方法,但我不知道如何调用在不同线程上创建的函数:(…线程将在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。在循环中使用定时器代替Thread.Sleep()
看起来您要创建某种慢飞效果。我建议您使用计时器而不是使用Thread.Sleep()循环。您可以在事件中创建和启用计时器。计时器每滴答一下,你就移动一下窗口。到达结束位置后,您只需禁用计时器(Enabled=false)。