2011-12-19 11 views
21

Ho un modulo figlio non modale che si apre da un modulo padre. Ho bisogno di centrare il modulo figlio nella sua forma padre. Ho impostato la proprietà di form figlio a CenterParent e provato questo:Come CenterParent un modulo non modale

Form2 f = new Form2(); 
f.Show(this); 

ma senza alcun risultato. Funziona con la forma modale, ma non con le forme non modali. Qualunque soluzione semplice, o devo passare attraverso tutto quel calcolo matematico per fissare la sua posizione al centro?

+1

hai provato a impostare la proprietà 'StartPosition'? –

+0

Ho provato, ho menzionato anche nella domanda .. Non funziona davvero con winforms per un dialogo non modale .. Non so perché è così .. – nawfal

+0

quando si imposta la proprietà? –

risposta

51

ho paura StartPosition.CenterParent è buono solo per le finestre di dialogo modali (.ShowDialog).
Dovrete impostare la posizione manualmente in quanto tale:

Form f2 = new Form(); 
f2.StartPosition = FormStartPosition.Manual; 
f2.Location = new Point(this.Location.X + (this.Width - f2.Width)/2, this.Location.Y + (this.Height - f2.Height)/2); 
f2.Show(this); 
+0

+1 per la tua risposta veloce come questa, ma avevo ottenuto quello che volevo in modo più semplice sopra .. – nawfal

+1

+1 Questo funziona, l'altro no, almeno per me. – kol

+1

Poiché l'altra risposta non funziona più per me, contrassegnerò questa come risposta – nawfal

3
Form2 f = new Form2(); 
f.StartPosition = FormStartPosition.CenterParent; 
f.Show(this); 
+0

sai perché funziona solo in questo modo ? e non quando si imposta la proprietà centerParent dal costruttore del modulo figlio? – nawfal

+0

nessuna idea, mi dispiace. –

+5

Strano ... Questo ** non funziona ** per me ... – kol

9

Sembra davvero strano che Show (questo) non si comporta allo stesso modo di ShowDialog (questo) w.r.t modulo di centraggio. Tutto quello che ho da offrire è la soluzione di Rotem in un modo pulito per nascondere la soluzione hacky.

creare una classe di estensione:

public static class Extension 
{ 
    public static Form CenterForm(this Form child, Form parent) 
    { 
     child.StartPosition = FormStartPosition.Manual; 
     child.Location = new Point(parent.Location.X + (parent.Width - child.Width)/2, parent.Location.Y + (parent.Height - child.Height)/2); 
     return child; 
    } 
} 

chiamata con il minimo sforzo:

var form = new Form(); 
form.CenterForm(this).Show(); 
3

Per form non modale, questa è la soluzione.

Se si desidera visualizzare una finestra di dialogo non modale nel centro del modulo padre, è necessario impostare StartPosition del modulo figlio su FormStartPosition.Manual.

form.StartPosition = FormStartPosition.Manual; 

form.Location = new Point(parent.Location.X + (parent.Width - form.Width)/2, parent.Location.Y + (parent.Height - form.Height)/2); 

form.Show(parent); 

In .NET Framework 4.0 - Se si imposta ControlBox proprietà del form figlio a false e FormBorderStyle proprietà NotSizable come di seguito:

form.ControlBox = false; 
form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 

poi si dovrà affrontare il problema in cui parte del form figlio doesn 't show, se StartPosition è impostato su FormStartPosition.Manual.

Per risolvere questo problema è necessario impostare la proprietà Localizable del modulo figlio su true.

+1

Grazie mille. I tuoi commenti sulla proprietà Localizable di un modulo hanno risolto un problema che mi dava fastidio da anni, in cui su alcuni sistemi dei clienti le mie forme pop-up sarebbero leggermente troppo piccole. Microsoft non è molto ben documentato. Capisci perché funziona e cosa sta succedendo quando Localizable è falso? o conosci qualche link valido che lo spieghi? Grazie ancora. – Erik

Problemi correlati