Кажется, что есть путаница между «Родителем» и «Владельцем». Если вы открываете форму как MDI-форму, т. Е. Встроенную в другую форму, то эта окружающая форма является Родителем. Свойство формы StartPosition со значением FormStartPosition.CenterParent ссылается на это. Параметр, который вы можете передать методу Show, является владельцем, а не родителем! Вот почему frm.StartPosition = FormStartPosition.CenterParent не работает так, как вы можете ожидать.
Следующий код, помещенный в форму, отцентрирует его относительно своего владельца с некоторым смещением, если для StartPosition установлено значение Manual. Небольшое смещение открывает формы плиточным способом. Это является преимуществом, если владелец и собственная форма имеют одинаковый размер или если вы открываете несколько собственных форм.
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
if (Owner != null && StartPosition == FormStartPosition.Manual) {
int offset = Owner.OwnedForms.Length * 38; // approx. 10mm
Point p = new Point(Owner.Left + Owner.Width / 2 - Width / 2 + offset, Owner.Top + Owner.Height / 2 - Height / 2 + offset);
this.Location = p;
}
}