Разница между свойством .Owner и ShowDialog (владелец IWin32Window)? - PullRequest
9 голосов
/ 27 декабря 2008

Я предполагаю, что владелец winform может быть установлен явно через свойство .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

Я также прочитал следующее здесь

Только родительская форма MDI может владеть другой формой, будь то дочерний MDI, модальное диалоговое окно или форма, в которой родительский элемент был установлен в качестве параметра Owner.

Если так, то метод А вообще не должен работать, не так ли?

Чего мне не хватает? Почему метод B не устанавливает владельца для MDIChild?

1 Ответ

4 голосов
/ 28 декабря 2008

Глядя на различия этих двух опций с помощью Reflector, кажется, что у них немного другая реализация: box.Owner = this просто назначьте предоставленное значение этого для внутреннего поля владельца. Однако при вызове ShowDialog(IWin32Window) реализация выполняет следующий вызов до присвоения значения:

owner = ((Control) owner).TopLevelControlInternal;

Это может привести к назначению MDIParent.

( Примечание : я далеко не эксперт по MDI, поэтому могу ошибаться).

...