16

我试图在调用表单时设置表单的位置.Show()。问题是因为我使用.Show而不是.ShowDialogStartPosition 值不起作用。我不能使用,.Showdialog因为我希望程序在显示表单时在后台工作。

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

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

但是当我运行代码时,表单每次启动时都会将自己置于不同的位置。

有什么解决办法吗?(我的代码从未在其他任何地方设置该位置)

4

2 回答 2

27

StartPosition 应该与Form.Show. 尝试:

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

附带说明一下,您不应该使用using带有Form.Show. using将调用Dispose表单,这是不需要的,因为表单的生命周期比这段代码长。

于 2013-06-28T16:14:56.050 回答
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 默认位置,该位置会有所不同当您启动表单时。然后当我调用新表单(连接表单)时,它的位置不是相对于它的父位置,而是位置 (0, 0)(屏幕的左上角)。所以我看到的是 MainForms 的位置发生了变化,这使得 Connecting Form 的位置看起来像是在移动。所以解决这个问题的方法基本上是先将新窗体的位置设置为主窗体的位置。之后,我能够将位置设置为 MainForm 的中心。

TL;DR 新表单的位置不是相对于父表单的位置,而是相对于我猜是 (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;
    }

希望这会帮助其他有同样问题的人!

于 2013-07-01T09:28:35.500 回答