Пользовательский элемент управления, который действует как стандартное окно, только ограниченное панелью

Я делаю программу для генерации кода для себя, и я создаю пользовательский интерфейс на основе Game Maker из-за того, насколько простой интерфейс. У него есть SplitContainer с Panel1, содержащей TreeView и Panel2, содержащую произвольное количество автономных окон (настоящих окон, а не какого-то хакерского обходного пути). Я хотел использовать пользовательские элементы управления для хранения элементов управления, которые я использую для изменения вещей, но я не могу придумать, как поместить его в окно внутри Panel2 splitContainer. Может кто-нибудь помочь мне?

Вот хороший пример:

http://i.stack.imgur.com/CG6kO.png

Эти два окна свойств спрайта - это то, что я пытаюсь сделать.


person Eagle-Eye    schedule 03.07.2011    source источник


Ответы (4)


Вы можете попробовать использовать форму MDI и реализовать свой элемент управления TreeView, проверить какую-то стыковочную панель. Я использовал это в прошлом (http://sourceforge.net/projects/dockpanelsuite/).

Он очень гибкий. Вы настраиваете одну из этих форм стыковочной панели, закрепленную слева от формы MDI. Он всегда будет «сверху», и пользователь может изменить его размер точно так же, как элемент управления разделителем в форме. Если хотите, он также может иметь функцию «автоскрытия», которая может быть или не быть желательной в вашем случае.

Затем он может содержать ваше древовидное представление, которое может загружать все дочерние формы MDI, которые вам нравятся.

Вы обнаружите, что не боретесь с тем, как «Windows» действительно хочет себя вести, и все будет работать намного более гладко.

person Stuart Helwig    schedule 04.07.2011
comment
Кажется, это именно то, что мне нужно. Кроме того, спасибо за ссылку на что-то с лицензией MIT. Это и zlib/zpng — мои любимые лицензии. - person Eagle-Eye; 04.07.2011
comment
Библиотека перестала работать, но я обнаружил, что могу создавать произвольное количество форм; в конструкторе родителя MDI добавьте IsMdiContainer = true;. Затем перейдите: newwindow = new FormNameGoesHere(); новое окно.MdiParent = это; новое окно.Показать(); всякий раз, когда вы хотите создать новую форму MDI. - person Eagle-Eye; 05.07.2011

я думаю, что то, что вы ищете, называется mdi-контейнер

однако единственный реальный контейнер mdi, который я видел до сих пор (в .NET), - это форма... к сожалению, нет панели или чего-то подобного...

но если вам просто нужен эффект «окно в окне»: просто создайте новую форму, установите для свойства TopLevel этого экземпляра значение false и добавьте экземпляр в свою форму/панель/разделенный контейнер/что угодно, как любой другой обычный элемент управления

person DarkSquirrel42    schedule 04.07.2011
comment
Не TopLevel управляет сдерживанием MDI, а IsMdiContainer и MdiParent свойства. - person Ben Voigt; 04.07.2011
comment
@ben да ... но MDI, похоже, требует, чтобы родительский контейнер был формой, и ничего больше. я не нашел способа создать настоящее приложение MDI, которое использует только ограниченную область формы для дочерних окон MDI. если OP просто нужно это окно в оконном эффекте, может быть достаточно создать форму с TopLevel=false, которую можно использовать как обычный элемент управления. - person DarkSquirrel42; 04.07.2011
comment
Как сказал Стюарт, доки внутри родительской формы ограничивают область, в пределах которой могут перемещаться дочерние MDI. Не знаю простого способа иметь несколько наборов дочерних элементов, каждый из которых находится в отдельной области родителя, но похоже, что Орлиный глаз не просит об этом. Но установка TopLevel = false просто превращает форму во всплывающее окно, предотвращая ее появление на панели задач. Он не ограничивает свое положение владельцем. - person Ben Voigt; 04.07.2011
comment
@ben ... хорошо, и после установки для TopLevel значения false попробуйте добавить форму в свойство Controls панели ... - person DarkSquirrel42; 04.07.2011

Поместите его в коллекцию Control Panel2 с помощью метода Add(), примените координаты, привязку и стыковку программно.

person Denis Biondic    schedule 03.07.2011
comment
Я знаю, как программно добавить пользовательский элемент управления; Мне нужно знать, как добавить пользовательский элемент управления, который находится в своем собственном окне, но все же внутри панели программно. - person Eagle-Eye; 04.07.2011
comment
Если у вас есть UserControl внутри формы, вставьте, а затем поместите этот UserControl в Panel2, а не всю форму? - person Denis Biondic; 04.07.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;
    }

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

Из Как реализовать a- form-in-a-form с переключением встроенных форм во время выполнения?

person Daniel Mošmondor    schedule 03.07.2011
comment
Дважды щелкните узлы TreeView, чтобы открыть новое окно, а не заменить текущее окно. - person Eagle-Eye; 04.07.2011