2008-12-27 22 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的专家,所以我可能在这里是错的)。

相关问题