Всем привет! Сегодня статья для тех, кто уже дошёл до плагинов с оконным интерфейсом, но пока двигает кнопки по конструктору окна вручную и указывает жёсткие размеры.
Введение
Контейнеры компоновки — это элементы, которые разбивают пространство окна на логические блоки, и предназначенные для размещения других элементов (в том числе и других контейнеров компоновки). В этой статье я рассмотрю самые часто используемые, об остальных можно почитать на других ресурсах
Grid
Это самый распространённый контейнер. Если мы будем пользоваться Grid без дополнительных настроек, то все попавшие в него элементы будут накладываться друг на друга. Если мы не будем указывать их размеры, то они будут заполнять всё его пространство.
В чём суть: мы можем разбить Grid на строки и столбцы, задать им ширину, в том числе и относительную (чтобы она зависела от размера окна), а затем размещать элементы в эти ячейки, в том числе растягивая на несколько ячеек. Давайте посмотрим пример:
1. Создаём 3 строки и 3 столбца вот так. Другое количество создаётся добавлением <ColumnDefinition/> или <RowDefinition/>.
2. Теперь рассмотрим добавление элементов:
Элемент может быть любым контролом или другим контейнером.
По порядку:
- Для кнопки под номером 0 мы указали её ряд Row и столбец Column. Номера строк и столбцов начинаются с 0. Поэтому она заняла всё пространство ячейки в строке 1 столбца 2.
- Для кнопки с номером 1 мы дополнительно указали RowSpan="2". Это означает, что она растянется на 2 ряда.
- Аналогично для кнопки с номером 2, но тут мы указали число столбцов, которое она заполняет, через ColumnSpan. Номер ряда у неё 0, поэтому отдельно Grid.Row можно не указывать.
StackPanel
Мой любимый контейнер. Как и следует из названия, элементы просто складываются друг за другом (по вертикали или горизонтали), в зависимости от выбранной ориентации (по умолчанию вертикальной). Он нравится мне, потому что можно не запариваться с разметкой окна, а просто складывать элементы подряд, и они будут стоять относительно ровно. Если в вертикальный StackPanel добавить горизонтальный StackPanel, то в каком-то ряду элементы встанут по горизонтали. Profit!
В общем, кажется, что тут всё просто и очевидно
DockPanel
Довольно интересный контейнер для сложных оконных интерфейсов. Суть тут в том, что мы как бы "прижимаем" элемент к краю окна с помощью свойства DockPanel.Dock, и он заполняет отведённое ему пространство. Тут важно учитывать порядок элементов в окне. Элемент занимает нужное ему место, а следующий элемент стремиться занять всё оставшееся свободным место, но не претендует на место верхнего элемента. Пример:
- Сначала мы прижали 4 кнопки к низу окна.
- Затем Button0 заняла всё нужное ей место по ширине, но по высоте прижалась к левому краю только до верха StackPanel.
- Следом Button1 заняла верхний ряд, но не залезая на уже занятые территории
- Оставшееся место взяла Button2
Заключение
В 99% случаев в реальном программировании под Revit я использовал только эти контейнеры. Если вам интересно узнать что-либо про другие контейнеры или другие аспекты WPF, пишите в комментарии, что именно вас интересует, постараюсь разобрать в следующих статьях.
И не забывайте подписываться на мой телеграм-канал о Revit API. До новых встреч!