2008-12-27 8 views
9

Przypuszczam właściciel WinForm można ustawić bezpośrednio za pośrednictwem właściwości .Owner lub przepuszczanie właściciela w przeciążonej metody ShowDialog (właściciel IWin32Window)Różnica między właściwością .Owner i ShowDialog (właściciel IWin32Window)?

Jestem w stanie zrozumieć, dlaczego te metody wykazują różne zachowanie gdy jest Praca z formularzami MDI .

Utworzyłem MDIParent i MDIChild.

Posiadam również prosty MyDialogBox, który wyświetla właściciela podczas ładowania.

MessageBox.Show("Dialog's owner is " + this.Owner.Name); 

Metoda A - W obciążeniu MDIChild Mam następujący kod, który powoduje właściciela MyDialogBox, który ma być ustawiony na MDIChild

MyDialogBox box = new MyDialogBox(); 
box.Owner = this; // Set owner as MDIChild 
box.ShowDialog(); 

Metoda B - Alternatywnie, w sposobie obciążenia MDIChild mam następujący kod, który powoduje właściciela MyDialogBox, który ma być ustawiony na MDIParent

MyDialogBox box = new MyDialogBox(); 
box.ShowDialog(this); // Pass MyMDIChild as owner 

ja również przeczytać następujący here

tylko forma dominująca MDI może posiadać inną formę, czy to dziecko MDI, modalne okno dialogowe lub formularz, w którym rodzic został ustawiony jako param Właściciel.

Jeśli tak, Metoda A nie powinna w ogóle działać, prawda?

Czego mi brakuje? Dlaczego metoda B nie ustawia właściciela na MDIChild?

+0

Spróbuj zrobić to w VB6 i sprawdź, czy pasuje do podanego linku. Jeśli tak, to chyba - framework ma błąd. – shahkalpesh

+0

Nie jestem pewien co do VB6, ale VB.NET zachowuje się tak samo jak C# – Preets

Odpowiedz

4

Patrząc na różnice tych 2 opcji za pomocą reflektora, wydaje się, że mają one nieco inną implementację: box.Owner = this wystarczy przypisać dostarczoną wartość do pola wewnętrznego właściciela. Jednak podczas wywoływania ShowDialog(IWin32Window), realizacja wykonuje następujące wezwanie przed przypisanie wartości:

owner = ((Control) owner).TopLevelControlInternal; 

Może to spowodować nadaniu MDIParent.

(Uwaga: Nie jestem ekspertem od MDI, więc mogę się mylić tutaj).

+2

Interesujące. Dlaczego stwardnienie rozsiane chciałoby, żeby oni zachowywali się inaczej, zadziwia mnie. – Preets

+0

Tak, to naprawdę dziwne. Nie widzę powodu, dla którego chcesz ustawić właściciela innego niż rodzic MDI. Chodzi o to, że kiedy użytkownik kliknie na formularz MDI, modalne okno dialogowe zostanie wyświetlone z przodu. W przeciwnym razie wydaje się, że rodzic MDI jest zablokowany/zawieszony. – Marc