Подтвердить что ты не робот

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

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

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;

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

4b9b3361

Ответ 1

Try:

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

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

loginForm.Show(this);

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

Ответ 2

Кажется, существует путаница между "Родитель" и "Владелец". Если вы открываете форму как MDI-форму, то есть внедряете ее в другую форму, то эта окружающая форма является родителем. Свойство формы StartPosition со значением FormStartPosition.CenterParent относится к этому. Параметр, который вы можете передать методу "Показать", - это "Владелец", а не "Родитель"! Вот почему 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;
    }
}

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Вам нужно следующее:

Замените меня этим .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

Ответ 7

childform = new Child();
childform.Show(this);

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

this.CenterToParent();

Ответ 8

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

Ответ 9

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

Ответ 10

Если вы хотите рассчитать свое собственное местоположение, сначала установите 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 и, следовательно, после отображения отображается дочернее местоположение.

Ответ 11

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

Попробуйте следующее:

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

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

public MyForm()
{
    InitializeComponent();

    this.StartPosition = FormStartPosition.CenterParent;
}

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

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

Ответ 15

Если какая-либо форма окна (дочерняя форма) была открыта из нового потока главного окна (родительская форма), то невозможно удерживать подокно в центре главного окна, поэтому нам нужно вручную исправить положение подокна с помощью означает координаты X и Y.

В свойствах подокна измените "StartPosition" на "Manual"

код в главном окне

private void SomeFunction()
{
    Thread m_Thread = new Thread(LoadingUIForm);
    m_Thread.Start();
    OtherParallelFunction();
    m_Thread.Abort();
}

private void LoadingUIForm()
{
    m_LoadingWindow = new LoadingForm(this);
    m_LoadingWindow.ShowDialog();
}

код в подокне для определения своей собственной позиции с помощью родительской текущей позиции, а также размера

public LoadingForm(Control m_Parent)
{
   InitializeComponent();
   this.Location = new Point( m_Parent.Location.X+(m_Parent.Size.Width/2)-(this.Size.Width/2),
                              m_Parent.Location.Y+(m_Parent.Size.Height/2)-(this.Size.Height/2)
                            );
}

Здесь вычисляются координаты центра родительского элемента, а подокно сохраняется точно в центре родительского элемента путем вычисления его собственного центра с помощью (this.height/2) и (this.width/2) этой функции: далее принимается за родительские перемещенные события также.

Ответ 16

    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);

        CenterToParent();
    }

Ответ 17

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

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)