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()

c# -窗体加载后移动

看起来您要创建某种慢飞效果。我建议您使用计时器而不是使用Thread.Sleep()循环。您可以在事件中创建和启用计时器。计时器每滴答一下,你就移动一下窗口。到达结束位置后,您只需禁用计时器(Enabled=false)。