调用Form.Show()方法时设置窗体的位置

18

我试图在使用.Show()调用表单时设置它的位置。问题是,因为我使用的是.Show而不是.ShowDialog,所以StartPosition值不起作用。我不能使用.Showdialog,因为我希望程序在显示表单的同时在后台执行任务。

当我创建表单时,我将其位置设置为固定值:

using (ConnectingForm CF = new ConnectingForm())
{
    CF.Show();
    CF.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2);
}

但是每次我运行代码时,窗体都会自动放置在不同的位置。

有什么解决办法吗?(窗体位置没有被代码其他部分设置过)


希望以下链接有修复方法。https://dev59.com/Y2Ei5IYBdhLWcg3wjc3E - user2852008
2个回答

29

使用 Form.Show 时,StartPosition 应该可以正常工作。尝试:

ConnectingForm CF = new ConnectingForm();
CF.StartPosition = FormStartPosition.CenterParent;
CF.Show(this);

如果您想手动放置该表单,就像您展示的那样,也可以完成,但仍需要将 StartPosition 属性设置为 Manual:
ConnectingForm CF = new ConnectingForm();
CF.StartPosition = FormStartPosition.Manual;
CF.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2);
CF.Show();

值得一提的是,你不应该在Form.Show中使用using语句。因为using会调用Dispose函数,这并不是期望的行为,因为表单的生命周期比代码块更长。


以下代码无法正常工作(新表单位于左上角):using (ConnectingForm CF = new ConnectingForm()) { CF.StartPosition = FormStartPosition.CenterParent; CF.Show(this); }而且this确实是正确父级的句柄。我使用using语句来确保表单被正确处理。由于与表单位置无关,因此我没有发布使用块内部的更多代码。 - Robin
使用以下代码也无法解决问题:using (ConnectingForm CF = new ConnectingForm()) { CF.StartPosition = FormStartPosition.Manual; CF.Show(this); CF.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2); }每次启动应用程序时,窗体位置都会发生变化,无法固定。 - Robin
当我仔细查看表单时,发现实际上不是新表单改变了位置,而是主表单每次启动时都会改变位置。然而这非常奇怪,因为我已经将新表单的位置设置为相对于主表单的位置。 - Robin

8

在其他线程的帮助下,我找到了一个可行的解决方案:

    using (ConnectingForm CF = new ConnectingForm())
    {
        CF.StartPosition = FormStartPosition.Manual;
        CF.Show(this);
        ......
    }

在新表单的“加载事件”中:
    private void ConnectingForm_Load(object sender, EventArgs e)
    {
        this.Location = this.Owner.Location;
        this.Left += this.Owner.ClientSize.Width / 2 - this.Width / 2;
        this.Top += this.Owner.ClientSize.Height / 2 - this.Height / 2;
    }

(如果我有错,请纠正我)以下是我对问题和解决方案的理解: 一开始的问题是第一个窗体(MainForm)的启动位置设置为Windows默认位置,这会导致每次启动窗体时位置都不同。当我调用新窗体(Connecting form)时,它的位置不是相对于父窗体的位置,而是在屏幕的左上角(0, 0)位置。所以我看到的是MainForm的位置变化,让Connecting Form的位置看起来像是在移动。因此,解决这个问题的方法基本上是首先将新窗体的位置设置为主窗体的位置。这样做后,我就可以将位置设置为MainForm的中心了。
简而言之,新窗体的位置与父窗体的位置无关,而是固定在一个位置(我猜是0,0)。
我为了方便自己,将MainForm的启动位置改为固定位置。我还添加了一个事件,以确保新窗体的位置始终位于MainForm的中心。
    private void Location_Changed(object sender, EventArgs e)
    {
        this.Location = this.Owner.Location;
        this.Left += this.Owner.ClientSize.Width / 2 - this.Width / 2;
        this.Top += this.Owner.ClientSize.Height / 2 - this.Height / 2;
    }

    private void ConnectingForm_Load(object sender, EventArgs e)
    {
        this.Owner.LocationChanged += new EventHandler(this.Location_Changed);
        this.Location = this.Owner.Location;
        this.Left += this.Owner.ClientSize.Width / 2 - this.Width / 2;
        this.Top += this.Owner.ClientSize.Height / 2 - this.Height / 2;
    }

希望这对有同样问题的人有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接