C# Winforms位置

C# Winforms位置,c#,winforms,C#,Winforms,我有一个包含2个表单、主窗口和第二个表单的应用程序 我想要的是在点击按钮时打开第二个表单,它的位置必须在主表单旁边(因此,如果主表单的宽度为600px,则新表单的X将为main.X+600) 尝试过这个,但似乎没有成功,它仍然在主窗体的顶部打开: private void button1_Click(object sender, EventArgs e) { var form = new SecondForm(); var main = this.Location; fo

我有一个包含2个
表单
、主窗口和第二个
表单
的应用程序

我想要的是在点击
按钮时打开第二个
表单
,它的位置必须在主表单旁边(因此,如果主表单的宽度为
600px
,则新
表单的
X
将为
main.X+600

尝试过这个,但似乎没有成功,它仍然在主窗体的顶部打开:

private void button1_Click(object sender, EventArgs e)
{
    var form = new SecondForm();
    var main = this.Location;
    form.Location = new Point((main.X + 600), main.Y);
    form.Show(); 
}

Location
属性是否不正确?

将表单的
StartPosition
设置为
FormStartPosition.Manual
。您可以在设计器中或从构造函数中执行此操作:

StartPosition = FormStartPosition.Manual;

位置
是正确的属性,但必须设置

Form.StartPosition = FormStartPosition.Manual;

也是。

很明显,您没有指望StartPosition属性。但是,将其更改为手动并不是正确的修复方法,您加载的第二个表单可能会在另一台具有不同视频DPI设置的机器上重新缩放自身。现在很普遍。进而可以更改其位置属性

正确的方法是等待加载事件触发,然后重新缩放,此时窗口还不可见。这是将其移动到正确位置的最佳时间。开始的位置现在不再重要了。像这样:

        var frm = new SecondForm();
        frm.Load += delegate {
            frm.Location = new Point(this.Right, this.Top);
        };
        frm.Show();

你看过使用DesktopLocation属性吗?我已经编辑了你的标题。请参见“”,其中的共识是“不,他们不应该”。最好使用
this.Width
而不是硬编码值(600)。是的,我遗漏了这个。感谢出于某种原因,将新表单的位置设置为
(this.Size.Width,this.Location,Y)
不会完全在旧表单的右边缘打开新表单,但仍会在一定程度上覆盖它。偏移X值似乎没有改变it@sd_dracula你需要
(this.Location.X+this.Size.Width,this.Location.Y)
来实现你想要的。