2008-12-27 19 views
9

Ich nehme an einem Besitzer winform kann über die .Owner Eigenschaft explizit festgelegt werden oder durch den Eigentümer in der überladenen Methode übergibt Showdialog (IWin32Window Inhaber)Unterschied zwischen. Owner-Eigenschaft und ShowDialog (IWin32Window-Besitzer)?

Ich bin nicht in der Lage zu verstehen, warum diese Methoden unterschiedliche Verhalten zeigen, wenn Arbeiten mit MDI Formen.

Ich habe ein MDIParent und ein MDIChild erstellt.

Ich habe auch eine einfache winform MyDialogBox, die ihren Besitzer bei Belastung anzeigt.

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

Methode A - Bei der Belastung von MDIChild Ich habe den folgenden Code, der die MyDialogBox Besitzer verursacht werden, auf MDIChild

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

Methode B - Alternativ kann in der Belastungsmethode MDIChild ich habe den folgenden Code, der die MyDialogBox Eigentümer verursacht werden auf MdiParent

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

Ich las auch die folgenden here

Nur das übergeordnete MDI-Formular eine andere Form besitzen kann, ist es ein MDI Kind sein, ein modaler Dialog oder ein Formular, in dem die Eltern wurde als Besitzer param gesetzt.

Wenn ja, sollte Methode A überhaupt nicht funktionieren, nicht wahr?

Was fehlt mir? Warum legt Methode B den Besitzer nicht auf MDIChild fest?

+0

Versuchen Sie dies in VB6 und sehen Sie, ob es mit dem von Ihnen angegebenen Link übereinstimmt. Wenn ja, - Framework hat einen Bug. – shahkalpesh

+0

Nicht sicher über VB6 aber VB.NET scheint sich genauso zu verhalten wie C# – Preets

Antwort

4

Betrachtet man die Unterschiede dieser beiden Optionen mit Reflector, so scheint es, dass sie eine etwas andere Implementierung haben: box.Owner = this Ordnen Sie einfach den angegebenen Wert dem internen Eigentümerfeld zu. Wenn jedoch ShowDialog(IWin32Window) Aufruf führt die Umsetzung den folgenden Aufruf, bevor den Wert zuweisen:

owner = ((Control) owner).TopLevelControlInternal; 

Diese Zuordnung des MdiParent führen könnte.

(Hinweis: Ich bin weit davon entfernt, ein Experte in Bezug auf MDI, also könnte ich hier falsch liegen).

+2

Interessant. Warum MS möchte, dass die beiden sich anders benehmen, erstaunt mich. – Preets

+0

Ja das ist wirklich seltsam. Ich sehe nicht, warum Sie einen anderen Besitzer als den MDI-Eltern festlegen möchten. Wenn der Benutzer auf das MDI-Formular klickt, wird der modale Dialog am häufigsten angezeigt. Ansonsten würde es so aussehen, als sei der MDI-Elternteil gesperrt/abgestürzt. – Marc