Показати дочірню форму в центрі батьківської форми на C #


76

Я створюю нову форму і дзвоню з батьківської форми наступним чином:

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, але не допоміг. Будь-які входи щодо цього?

Відповіді:


134

Спробуйте:

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

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

loginForm.Show(this);

Вам все одно потрібно буде вказати StartPosition.


16
Ви також можете встановити цю властивість LoginForm у конструкторі.
Тім Хуліхан,

53
loginForm.StartPosition = FormStartPosition.CenterParent плюс loginForm.Show (це); не центрує форму.
Pedro77

@ Pedro77 У мене схожа ситуація, за винятком того, що я зробив діалогове вікно шоу з іншого потоку, тому це не дозволить мені передати "це" в showDialog. будь-яка пропозиція тут ??
Аніл,

1
@Anil Я думаю, що вам не слід створювати ідентифікатори інтерфейсу користувача з іншого потоку. Ви повинні використовувати викликати begininvoke до цього завдання. Погляньте на ці команди.
Pedro77

20

Параметр батьків не працює для мене, якщо я не використовую form.ShowDialog();.

При використанні form.Show(); або form.Show(this);нічого не працювало, поки я не використовував this.CenterToParent();,. Я просто помістив це в метод Load форми. Все добре.

Початкове положення до центру батьків було встановлено і працює під час використання діалогового вікна блокування.


18

Схоже, існує плутанина між "Батьком" та "Власником". Якщо ви відкриваєте форму як 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;
    }
}

Я майже впевнений, що це CenterParentтакож працює щодо Owner, принаймні, з версією .net, яку я використовую.
binki

12

Якщо припустити, що ваш код працює у вашій батьківській формі, то щось подібне, мабуть, саме те, що ви шукаєте:

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

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


9

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

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


4

Вам потрібно це:

Замініть мене на 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

Це працює у всіх випадках, поміняйте 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);

2

У формі 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();

2

Якщо ви хочете розрахувати своє власне місцезнаходження, спочатку встановіть 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і тому воно змінює місце розташування дитини після показу.


2

Коли ви хочете використовувати неблокуюче вікно (show () замість showDialog ()), це не працює:

//not work with .Show(this) but only with .ShowDialog(this)
loginForm.StartPosition = FormStartPosition.CenterParent;
loginForm.Show(this);

У цьому випадку ви можете використовувати цей код для центрування дочірньої форми перед відображенням форми:

//this = the parent
frmDownloadPercent frm = new frmDownloadPercent();
frm.Show(this); //this = the parent form
//here the tips
frm.Top = this.Top + ((this.Height / 2) - (frm.Height / 2));
frm.Left = this.Left + ((this.Width / 2) - (frm.Width / 2));

Це має бути обрана відповідь !!! +1
Si8

0

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

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

0

Ви можете встановити 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);
}

0

Якщо будь-яку форму вікна (дочірню форму) відкрито з нового потоку головного вікна (батьківська форма), тоді неможливо утримувати допоміжне вікно в центрі головного вікна, отже, нам потрібно зафіксувати положення підвікна вручну, засоби координат 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) ця функція може бути додатково взято для батьківських перенесених подій.


0

Як допоміжна форма, я думаю, вона не почнеться в середині батьківської форми, поки ви не покажете її як діалогове вікно. .......... Form2.ShowDialog();

я збирався зробити про форму. і це ідеально, що я шукаю. і доки ви не закриєте About_form, до якого ви не можете торкнутися / клацнути що-небудь із форм батьків, коли ви клацнете для About_Form (у моєму випадку).


-1

Можливо, батько ще не встановлений під час спроби отримати до нього доступ.

Спробуйте це:

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

3
CenterToParent не є загальнодоступним методом. Вам потрібно делегувати цей метод як загальнодоступний із вашого контролю.
Ярек

-1

Якщо вам потрібно відцентрувати вашу дитинуForm, від childForm, тоді код буде приблизно таким. Цей код є у дочірній формі.cs

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


-4

Чому б не використовувати це?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.