Показать дочернюю форму в центре родительской формы в C#


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

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;

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

15 61

15 ответов:

попробуй:

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

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

loginForm.Show(this);

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

Кажется, существует путаница между" родителем "и"владельцем". Если вы открываете форму как MDI-форму, т. е. встроенную в другую форму, то эта окружающая форма является родительской. Свойство формы StartPosition со значением FormStartPosition.CenterParent относится к этому. Параметр, который вы можете передать в метод Show, является владельцем, а не родителем! Вот почему frm.StartPosition = FormStartPosition.CenterParent не работает, как вы можете ожидать.

следующий код помещается в a форма будет центрировать его относительно своего владельца с некоторым смещением, если его начальное положение установлено в ручное. Небольшое смещение открывает формы в плиточном виде. Это преимущество, если владелец и принадлежащая форма имеют одинаковый размер или если вы открываете несколько принадлежащих форм.

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;
    }
}

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

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

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

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

FrmLogin f = new FrmLogin();
f.MdiParent = this;
f.StartPosition = FormStartPosition.CenterScreen;
f.Show();

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

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

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

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

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

  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
childform = new Child();
childform.Show(this);

в случае childform load

this.CenterToParent();

в форме 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();

он работает во всех случаях, поменять 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);

родитель, наверное, еще не установлен, когда вы пытаетесь получить к нему доступ.

попробуйте это:

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

сделать форму Windows, а затем поставить опцию для него : CenterParent затем использовать этот код:

yourChildFormName x = new yourChildFormName();
x.ShowDialog();

Если вам нужно центрировать свою дочернюю форму, из childForm тогда код будет примерно таким. Этот код находится в дочерней форме.cs

this.Show(parent as Form);    // I received the parent object as Object type
this.CenterToParent();

если вы хотите рассчитать свое собственное местоположение, то сначала установите StartPosition to 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);

где это основная / родительская форма, так же, как расположение.Х.

значение по умолчанию StartPosition и FormStartPosition.CenterParent и поэтому он изменяет местоположение ребенка после показа.

Вы можете установить StartPosition в конструкторе дочерней формы так, чтобы все новые экземпляры формы были центрированы на ее родителе:

public MyForm()
{
    InitializeComponent();

    this.StartPosition = FormStartPosition.CenterParent;
}

конечно, вы также можете установить свойство StartPosition в свойствах конструктора для вашего ребенка форме. Если вы хотите отобразить дочернюю форму как модальное диалоговое окно, просто установите владельца окна в параметре для метода ShowDialog:

private void buttonShowMyForm_Click(object sender, EventArgs e)
{
    MyForm form = new MyForm();
    form.ShowDialog(this);
}

почему бы не использовать это?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)