Показать дочернюю форму в центре родительской формы в 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 ответов:
попробуй:
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
в форме 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
toFormStartPosition.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); }