9

winform の所有者は、.Ownerプロパティを介して明示的に設定できると思います。または、オーバーロードされたメソッドShowDialog(IWin32Window owner)で所有者を渡します。

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 の load メソッドで、次のコードを使用すると、MyDialogBox の所有者がMDIParentに設定されます。

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

私はまた、ここで次のことを読みました

MDI 親フォームのみが、MDI 子、モーダル ダイアログ、または親が Owner パラメータとして設定されたフォームなど、別のフォームを所有できます。

もしそうなら、方法Aはまったく機能しないはずですよね?

私は何が欠けていますか?メソッド B が所有者を MDIChild に設定しないのはなぜですか?

4

1 に答える 1

4

Reflectorを使用してこれら2つのオプションの違いを見ると、実装が少し異なるようです。 box.Owner = this提供された値を内部所有者フィールドに割り当てるだけです。ただし、を呼び出すShowDialog(IWin32Window)場合、実装は値を割り当てる前に次の呼び出しを実行します。

owner = ((Control) owner).TopLevelControlInternal;

これにより、MDIParentが割り当てられる可能性があります。

:私はMDIの専門家にはほど遠いので、ここでは間違っている可能性があります)。

于 2008-12-28T08:55:37.940 に答える