Показать дочернюю форму в центре родительской формы в С#
Я создаю новую форму и вызываю из родительской формы следующим образом:
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, но не помог. Любые входы на этом?
Ответы
Ответ 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)