BillWoodruff
Если это вообще возможно, я предлагаю вам не использовать MDI-приложения WinForm архитектуры приложения; это устаревшие; это визуально непривлекательным; и, есть лучше способы построения пользовательского интерфейса, который содержит элементы (использовать элементы управления UserControl, или панелями, или использовать элемент управления TabControl).
WinForm никогда не может быть оба форма MDIParent и форма MDIChild; надеюсь, вы не имели этого в виду здесь. Хотя вы действительно можете сделать форму, содержащуюся в другой форме (не в форме MDIParent), я настоятельно рекомендую вам никогда этого не делать.
Предложения:
1.в вашей основной форме (MDIParent) создайте экземпляры всех форм, которые вам нужно будет показать как формы MDIChild.
2. покажите эти детские формы, когда вам нужно.
3. Если вы хотите, чтобы событие в дочерней форме вызвало некоторые изменения в пользовательском интерфейсе MDI, например открытие другой дочерней формы:
3. a. в ChildForm1:
public Action NotifyMainFormToOpenChildForm2;
private void btnNotify_Click(object sender, EventArgs e)
{
if (NotifyMainFormToOpenChildForm2 != null)
{
NotifyMainFormToOpenChildForm2();
}
}
3. b. в родительской форме MDI:
private ChildForm1 cForm1;
private ChildForm2 cForm2;
private void MDIParentForm_Load(object sender, EventArgs e)
{
cForm1 = new ChildForm1();
cForm1.MdiParent = this;
cForm1.NotifyMainFormToOpenChildForm2 += NotifyMainFormToOpenForm2;
cForm2 = new ChildForm2();
cForm2.MdiParent = this;
cForm1.Show();
}
private void NotifyMainFormToOpenForm2()
{
cForm2.Show();
}
В этом примере мы вводим указатель на исполняемый код, который открывает ChildForm2 (в MDIParentForm) в ChildForm1. Для этого мы использовали делегат, делегат типа Action, который дает нам простой в использовании синтаксис.
Когда кнопка нажата в ChildForm1, она проверяет, есть ли допустимая ссылка на код в делегате действия, и, если есть, она выполняет тот код, который находится в обработчике на MDIParentForm, и этот код показывает ChildForm2.
Проблема в том, чтобы перетаскивать дочерние формы MDI так, чтобы они частично выходили за границы родительской формы MDI: ну, это один из недостатков модели MDI, имхо. Чтобы это работало правильно, требуется использовать Windows API для подавления отображения полос прокрутки из-за внутреннего недостатка элемента управления.
На сегодня у меня мало времени (GMT +7), но если вы опубликуете еще один вопрос о проблеме ограничения дочерних форм границами родительской формы MDI ... и вы сделали какую-то попытку решить эту проблему для себя, я отвечу.