Как реализовать форму-внутри-формы с переключением встроенных форм во время выполнения? - PullRequest
2 голосов
/ 15 февраля 2011

Мне нужно реализовать поведение, подобное TabControl, с ручным переключением страниц (по событию, например, при нажатии кнопки) и созданием и реализацией всех страниц в виде отдельных форм.Форма, которая должна быть включена (как элемент управления панели) в основную форму и заменена на другую форму по мере необходимости.

Как этого добиться?

PS: причина, по которой я не хочуВместо этого используйте TabControl, потому что вкладок будет слишком много - я бы предпочел представить их список в виде TreeView и создавать его по требованию.Другая причина исходит от другого моего проекта - там я собираюсь реализовать плагины, в которых панель внутри главного окна будет обеспечиваться динамически загружаемым классом и будет переключаться во время выполнения.

Ответы [ 3 ]

2 голосов
/ 15 февраля 2011

Мне нужно реализовать поведение, подобное TabControl, с ручными (по событию, например, при нажатии кнопки) страницами, переключающими и имеющими все страницы, разработанные и реализованные как отдельные формы

Могу ли я спросить , почему это требование?Похоже, логичным подходом было бы создание набора пользовательских контролей.Вы можете поместить UserControl в форму, и вы можете поместить UserControl во вкладку.Вы получаете модульность без головной боли при реализации очень странного требования, которое является примером использования, который разработчики API явно не считают действительным.Я просто не могу придумать вескую причину, чтобы выбрать предложенный вами маршрут.

1 голос
/ 15 февраля 2011

Я однажды сделал подобное, и по этой причине у меня есть метод ReplaceControl, который я вставил ниже:

    static public void ReplaceControl(Control ToReplace, Form ReplaceWith) {
        ReplaceWith.TopLevel=false;
        ReplaceWith.FormBorderStyle=FormBorderStyle.None;
        ReplaceWith.Show();
        ReplaceWith.Anchor=ToReplace.Anchor;
        ReplaceWith.Dock=ToReplace.Dock;
        ReplaceWith.Font=ToReplace.Font;
        ReplaceWith.Size=ToReplace.Size;
        ReplaceWith.Location=ToReplace.Location;
        ToReplace.Parent.Controls.Add(ReplaceWith);
        ToReplace.Visible=false;
    }

Осталось только создать вручную какой-либо элемент управления в форме в качестве заполнителя для вашей формы. Используйте ярлык, например.

1 голос
/ 15 февраля 2011

Вы можете сделать это с MDIForm в качестве основной формы, а затем с простыми старыми формами в качестве отдельных форм. Или вы можете инкапсулировать функциональность каждого элемента в виде UserControl, который затем можно заменить на форму в коде.

Преимущество инкапсуляции ваших элементов пользовательского интерфейса в UserControls заключается в том, что если вам по какой-либо причине они нужны для того, чтобы они стали формами в вашем приложении, вы можете просто удалить UserControl на форме.

Обновление: Поскольку вы хотите использовать TreeView для выбора того, на что смотрит пользователь, вы определенно хотите сделать это как набор пользовательских контролов. Схема проста: TreeView слева и любой активный элемент управления справа.

Нет необходимости оправдывать не использование TabControl - вкладки - худший элемент пользовательского интерфейса в истории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...