2011-12-19 6 views
21

Mam niemodalny formularz podrzędny, który otwiera się z formularza nadrzędnego. Potrzebuję wyśrodkować formularz dziecka do jego formy rodzica. Mam ustawiony właściwość formularza dziecko do CenterParent i próbowałem to:Jak CenterParent w formie niemodalnej

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

ale bezskutecznie. Działa to w formie modalnej, ale nie w przypadku form niemodalnych. Jakiekolwiek proste rozwiązanie, czy też muszę przejść przez te matematyczne obliczenia, aby ustalić jego położenie na środku?

+1

Czy próbowałeś ustawić właściwość 'StartPosition'? –

+0

Próbowałem, wspomniałem również w pytaniu. To nie działa tak naprawdę z winformami dla niemodalnego okna dialogowego .. Nie wiem dlaczego tak jest .. – nawfal

+0

Kiedy ustawiasz właściwość? –

Odpowiedz

51

Obawiam StartPosition.CenterParent jest dobre tylko dla modalnych okien dialogowych (.ShowDialog).
Musisz ustawić lokalizację ręcznie, takie jak:

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 za szybką odpowiedź w ten sposób, ale miałem to, czego chciałem, w prostszy sposób powyżej .. – nawfal

+1

+1 Ten działa, drugi nie, przynajmniej dla mnie. – kol

+1

Ponieważ druga odpowiedź nie działa dla mnie dłużej, mam zamiar oznaczyć to jako odpowiedź – nawfal

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

czy wiesz, dlaczego to działa tylko w ten sposób ? a nie podczas ustawiania właściwości centerParent z konstruktora formularza potomnego? – nawfal

+0

Nie mam pojęcia, przepraszam. –

+5

Dziwne ... To ** nie działa ** dla mnie ... – kol

9

Wydaje się bardzo dziwne, że przedstawienie (to) nie zachowuje się tak samo jak ShowDialog (this) w.r.t formy centrowania. Wszystko, co mam do zaoferowania, to rozwiązanie firmy Rotem, które pozwala ukryć hacky.

Utwórz klasę rozszerzenia:

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

nazwać to z minimalnym zamieszanie:

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

dla formularza niemodalnego, jest to rozwiązanie.

Aby wyświetlić okno dialogowe bez modelu w środku formularza nadrzędnego, należy ustawić opcję StartPosition podrzędnego formularza na 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); 

w .NET Framework 4.0 - Jeśli ustawisz właściwość CONTROLBOX formy dziecka do false i FormBorderStyle właściwość NotSizable jak poniżej:

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

wtedy zmierzyć się z problemem, gdy część formularza dziecko nie robi pokaż, jeśli StartPosition jest ustawione na FormStartPosition.Manual.

Aby rozwiązać ten problem, należy ustawić właściwość Localizable dziecka w formularzu na true.

+1

Dziękuję bardzo. Twoje komentarze na temat właściwości Localizable formularza rozwiązały problem, który podsłuchiwał mnie od wieków, gdzie w systemach niektórych klientów moje wyskakujące formularze byłyby nieco za małe. Nie jest to bardzo dobrze udokumentowane przez Microsoft. Czy rozumiesz, dlaczego to działa i co się dzieje, gdy lokalizacja jest fałszywa? lub znasz jakieś dobre linki, które je tłumaczą? Dzięki jeszcze raz. – Erik