Показать дочернюю форму в центре родительской формы в C # - PullRequest
68 голосов
/ 03 июня 2009

Я создаю новую форму и вызываю из родительской формы следующим образом:

loginForm = new SubLogin();   
loginForm.Show();

Мне нужно отобразить дочернюю форму в центре родителя. Итак, при загрузке дочерней формы я делаю следующее: `

Point p = new Point(this.ParentForm.Width / 2 - this.Width / 2, this.ParentForm.Height / 2 - this.Height / 2);
this.Location = p;

Но это выдает ошибку, так как родительская форма пуста. Я также попытался установить свойство Parent, но это не помогло. Любые входы по этому поводу?

Ответы [ 16 ]

125 голосов
/ 03 июня 2009

Попробуйте:

loginForm.StartPosition = FormStartPosition.CenterParent;
loginForm.ShowDialog(this);

Конечно, дочерний элемент для теперь будет блокирующей формой (диалоговым окном) родительского окна, если это не нужно, просто замените ShowDialog на Show ..

loginForm.Show(this);

Вам все равно нужно будет указать StartPosition.

15 голосов
/ 01 августа 2011

Кажется, что есть путаница между «Родителем» и «Владельцем». Если вы открываете форму как 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;
    }
}
10 голосов
/ 03 июня 2009

Если ваш код выполняется внутри вашей родительской формы, то, вероятно, вам нужно что-то вроде этого:

loginForm = new SubLogin();
loginForm.StartPosition = FormStartPosition.CenterParent
loginForm.Show(this);

Для записи есть также функция Form.CenterToParent(), если вам нужно центрировать ее после создания по какой-либо причине.

8 голосов
/ 03 марта 2016

Настройка родителя не работает для меня, если я не использую form.ShowDialog();.

При использовании form.Show(); или form.Show(this); ничего не работало, пока я не использовал, this.CenterToParent();. Я просто поместил это в метод Load формы. Все хорошо.

Начальная позиция до центра родителя была установлена ​​и работает при использовании блокировки showdialog.

7 голосов
/ 15 февраля 2012

При запуске формы внутри формы MDIForm вам нужно будет использовать .CenterScreen вместо .CenterParent.

FrmLogin f = new FrmLogin();
f.MdiParent = this;
f.StartPosition = FormStartPosition.CenterScreen;
f.Show();
4 голосов
/ 04 октября 2010

Вам нужно это:

Замените меня на this.parent, но вам нужно установить родителя, прежде чем показывать эту форму.

  Private Sub ÜberToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÜberToolStripMenuItem.Click

        'About.StartPosition = FormStartPosition.Manual ' !!!!!
        About.Location = New Point(Me.Location.X + Me.Width / 2 - About.Width / 2, Me.Location.Y + Me.Height / 2 - About.Height / 2)
        About.Show()
    End Sub
3 голосов
/ 13 октября 2017

Работает во всех случаях, замените Form1 для вашей основной формы.

Popup popup = new Popup();
popup.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
popup.Location = new System.Drawing.Point((Form1.ActiveForm.Location.X + Form1.ActiveForm.Width / 2) - (popup.Width / 2),(Form1.ActiveForm.Location.Y + Form1.ActiveForm.Height / 2) - (popup.Height / 2));
popup.Show(Form1.ActiveForm);
3 голосов
/ 17 ноября 2016
childform = new Child();
childform.Show(this);

В случае загрузки дочерней формы

this.CenterToParent();
2 голосов
/ 03 июня 2009

В форме SubLogin я бы предоставил метод SetLocation, чтобы вы могли установить его из родительской формы:

public class SubLogin : Form
{
   public void SetLocation(Point p)
   {
      this.Location = p;
   }
} 

Тогда из вашей основной формы:

loginForm = new SubLogin();   
Point p = //do math to get point
loginForm.SetLocation(p);
loginForm.Show();
1 голос
/ 21 октября 2014

Если вы хотите рассчитать свое собственное местоположение, то сначала установите StartPosition на FormStartPosition.Manual:

Form Child = new Form();
Child.StartPosition = FormStartPosition.Manual;
Child.Location = new Point(Location.X + (Width - Child.Width) / 2, Location.Y + (Height - Child.Height) / 2);
Child.Show(this);

Где это основная / родительская форма, как и Location.X.

Значение по умолчанию для StartPosition равно FormStartPosition.CenterParent и, следовательно, оно меняет местоположение ребенка после отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...