2012-07-20 117 views
0

我无法让子窗体以它的父窗体为中心。我一直在尝试各种各样的建议,从使用ShowDialog或不使用ShowDialog到各种各样的“计算你的表单的位置”代码。C#CenterParent使用ShowDialog不起作用

这真的不应该如此复杂,我想。

无论如何,这里有一些代码。下面的代码是我实例化表单并要求它打开的地方。此代码中的this是MainForm。

FormName myForm = new FormName(); 
myForm.ShowDialog(this); 

我已经设置窗体的StartPositionCenterParent但如果我四处移动MainForm,然后重新打开窗体,它不跟随。事实上,它保持正确的位置,无论如何。它甚至不是中心屏幕!

在窗体的构造函数中,我没有设置表单的位置。

我也不会在窗体的Load方法中设置窗体的位置。

请帮忙!

编辑: 我试过单步通过构造函数并加载窗体的方法,看他们是否完成前救援,他们工作得很好。

+2

您可能需要张贴更多代码。这对我来说每次都适用。 – dlev 2012-07-20 23:14:43

+0

你想看什么代码? – Kashif 2012-07-20 23:21:06

回答

4

事实证明,向表单的构造函数添加代码是一个糟糕的主意,并会导致各种奇怪的行为。而应该在Form Load事件中添加表单的代码。这是我的问题的根源。

+1

感谢这个soln,我一直试图很长时间才得到这个正确的,但正如你所提到的,它必须在代码中明确定义。如果你从属性中设置它,它甚至不会工作 – electricalbah 2013-07-23 05:14:47

0

下面的代码工作正常,我:

var MainForm = new Form(); 
var SubForm = new Form { 
    StartPosition = FormStartPosition.CenterParent, 
    Width = 200, 
    Height = 200, 
}; 

MainForm.MouseClick += (sender, args) => { SubForm.ShowDialog(MainForm); }; 
MainForm.Show(); 

当您双击它的MainForm中心打开它的子​​窗体。然后,当您关闭子窗体并移动MainForm时,再次双击MainForm时,SubForm再次显示居中到MainForm。

+0

嗨@luisprerezphd,本质上这是我使用的相同的代码。你的只是非常集中,我通过resx和MainForm.cs文件 – Kashif 2012-07-20 23:31:16

+0

@Kashif传播,据我所知,唯一的两件事情就是该子表单的StartPosition设置为FormStartPosition.CenterParent,它使用'ShowDialog()'显示,并且你想要的中心窗体作为参数传递。如果不是中心,应该在调用ShowDialog()之前运行调试器来检查子窗体上的“StartPosition”的值。你现在如何分配'StartPosition'? – 2012-07-20 23:43:26

+0

我通过表单的属性分配'StartPosition'字段 – Kashif 2012-07-21 00:51:23