2009-06-03 21 views
56

creo una nuova forma e chiamata dal form padre come segue:Mostra un form figlio nel centro di form padre in C#

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

ho bisogno di visualizzare il modulo bambino al centro del genitore. Così, nel carico form figlio faccio il foll: `

Point p = new Point(this.ParentForm.Width/2 - this.Width/2, this.ParentForm.Height/2 - this.Height/2); 
this.Location = p; 

Ma questo sta gettando errore come forma del genitore è nullo. Ho provato a impostare la proprietà Parent, ma non è stato d'aiuto. Qualche input su questo?

+0

Che errore si ottiene? – Joseph

risposta

113

Prova:

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

Naturalmente il bambino per ora sarà una forma di blocco (finestra) della finestra padre, se questo non è desiderato, allora basta sostituire ShowDialog con Show ..

loginForm.Show(this); 

Sarà comunque necessario specificare StartPosition.

+12

È inoltre possibile impostare la proprietà di LoginForm nella finestra di progettazione. –

+37

loginForm.StartPosition = FormStartPosition.CenterParent plus loginForm.Show (this); non centra la forma. – Pedro77

2

Sulla SubLogin Modulo vorrei esporre un metodo di setLocation in modo che è possibile impostare dal vostro form padre:

public class SubLogin : Form 
{ 
    public void SetLocation(Point p) 
    { 
     this.Location = p; 
    } 
} 

Poi, dal modulo principale:

loginForm = new SubLogin(); 
Point p = //do math to get point 
loginForm.SetLocation(p); 
loginForm.Show(); 
11

Assumendo che il codice è in esecuzione all'interno del modulo padre, quindi qualcosa del genere è probabilmente quello che stai cercando:

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

Per la cronaca, c'è anche una funzione Form.CenterToParent(), se è necessario centrarla dopo la creazione anche per qualsiasi motivo.

0

Il genitore probabilmente non è ancora impostato quando si sta tentando di accedervi.

Prova questa:

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

CenterToParent non è un metodo pubblico. È necessario delegare questo metodo come metodo pubblico dal proprio controllo. – Jarek

4

Hai bisogno di questo:

sostituirmi con this.parent, ma è necessario impostare genitore prima di mostrare quella forma.

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 
13

Sembra esserci una confusione tra "Genitore" e "Proprietario". Se apri un modulo come modulo MDI, cioè incorporato in un altro modulo, questa forma circostante è il genitore. La proprietà del modulo StartPosition con il valore FormStartPosition.CenterParent fa riferimento a questo. Il parametro che puoi passare al metodo Show è il proprietario, non il genitore! Questo è il motivo per cui frm.StartPosition = FormStartPosition.CenterParent non funziona come ci si potrebbe aspettare.

Il seguente codice inserito in un modulo lo centrerà rispetto al proprietario con un po 'di offset, se StartPosition è impostato su Manuale. L'offset piccolo apre le forme in modo affiancato. Questo è un vantaggio se il proprietario e il modulo di proprietà hanno la stessa dimensione o se si aprono più moduli di proprietà.

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

Sono abbastanza sicuro che 'CenterParent' opera anche relativamente a' Owner', almeno con la versione di .net che sto usando. – binki

7

Quando si lancia un modulo all'interno di un modulo MDIForm si dovranno utilizzare .CenterScreen invece di .CenterParent.

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

Perché non utilizzare questo?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

0

Fare un Windows Form, quindi opzione put per esso: CenterParent quindi utilizzare questo codice:

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

Se si vuole calcolare la propria posizione, poi primo set 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); 

Se questo è il principale/genitore per m, proprio come Location.X.

Il valore predefinito per StartPosition è FormStartPosition.CenterParent e pertanto modifica la posizione del bambino dopo la visualizzazione.

+0

Questa risposta funziona per me. Grazie. –

0

Se si deve centrare il proprio childForm, da childForm il codice sarà simile a questo. Questo codice è nelle childForm.cs

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

L'impostazione del genitore non funziona per me, se non lo uso form.ShowDialog();.

Quando si utilizza form.Show(); o form.Show(this); niente ha funzionato fino a quando non ho utilizzato, this.CenterToParent();. L'ho appena inserito nel metodo Load del modulo. Va tutto bene.

La posizione iniziale al centro di padre è stata impostata e funziona quando si utilizza il parametro di visualizzazione di blocco.

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

In carico ChildForm evento

this.CenterToParent(); 
0

È possibile impostare lo StartPosition nel costruttore del form figlio in modo che tutte le nuove istanze del modulo vengono centrati al suo genitore:

public MyForm() 
{ 
    InitializeComponent(); 

    this.StartPosition = FormStartPosition.CenterParent; 
} 

Ovviamente, è possibile anche impostare la proprietà StartPosition nelle proprietà di Designer per il modulo figlio. Quando si desidera visualizzare il modulo bambino come finestra di dialogo modale, è sufficiente impostare il proprietario della finestra nel parametro per il metodo ShowDialog:

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

Funziona in tutti i casi, scambiare Form1 per il modulo principale.

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