2008-12-27 50 views
9

我相信一個winform的所有者可以明確地通過.Owner財產或使車主在重載的方法來設置的ShowDialog(IWin32Window所有者).Owner屬性和ShowDialog(IWin32Window所有者)之間的區別?

我無法理解爲什麼這些方法表現出不同的行爲時,使用MDI表格

我已經創建了MDIParent和MDIChild。

我也有一個簡單的winform MyDialogBox,顯示它的負載所有者。

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

方法A - 在MDIChild的負載我有以下代碼,這會導致MyDialogBox的所有者被設置爲MDIChild

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

方法B - 可選地,在負載方法MDIChild我有下面的代碼,這會導致MyDialogBox的所有者設置爲的MdiParent

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

我也閱讀下列here

只有MDI父窗體可以根據自己的另一種形式,無論是MDI子,一個模式對話框或者家長被設置爲所有者PARAM形式。

如果是的話方法A根本不應該工作,不是嗎?

我錯過了什麼?爲什麼方法B沒有將所有者設置爲MDIChild?

+0

嘗試在VB6中執行此操作,看看它是否與您提供的鏈接相匹配。如果是這樣,我猜 - 框架有一個錯誤。 – shahkalpesh 2008-12-28 19:57:32

+0

不確定VB6,但VB.NET似乎與C#一樣。 – Preets 2008-12-30 16:15:40

回答

4

使用Reflector查看這兩個選項的差異,似乎他們有一個稍微不同的實現: box.Owner = this只是將提供的值分配給內部所有者字段。 但是,調用ShowDialog(IWin32Window)時,實施執行以下調用,分配值之前:

owner = ((Control) owner).TopLevelControlInternal; 

這可能會導致的MdiParent的分配。

注意:我遠非MDI的專家,所以我可能在這裏是錯的)。

相關問題