Найти тему

Контейнеры компоновки в WPF

Оглавление

Всем привет! Сегодня статья для тех, кто уже дошёл до плагинов с оконным интерфейсом, но пока двигает кнопки по конструктору окна вручную и указывает жёсткие размеры.

Введение

Контейнеры компоновки — это элементы, которые разбивают пространство окна на логические блоки, и предназначенные для размещения других элементов (в том числе и других контейнеров компоновки). В этой статье я рассмотрю самые часто используемые, об остальных можно почитать на других ресурсах

Grid

Это самый распространённый контейнер. Если мы будем пользоваться Grid без дополнительных настроек, то все попавшие в него элементы будут накладываться друг на друга. Если мы не будем указывать их размеры, то они будут заполнять всё его пространство.

В чём суть: мы можем разбить Grid на строки и столбцы, задать им ширину, в том числе и относительную (чтобы она зависела от размера окна), а затем размещать элементы в эти ячейки, в том числе растягивая на несколько ячеек. Давайте посмотрим пример:

1. Создаём 3 строки и 3 столбца вот так. Другое количество создаётся добавлением <ColumnDefinition/> или <RowDefinition/>.

2. Теперь рассмотрим добавление элементов:

Элемент может быть любым контролом или другим контейнером.

-2

По порядку:

  • Для кнопки под номером 0 мы указали её ряд Row и столбец Column. Номера строк и столбцов начинаются с 0. Поэтому она заняла всё пространство ячейки в строке 1 столбца 2.
  • Для кнопки с номером 1 мы дополнительно указали RowSpan="2". Это означает, что она растянется на 2 ряда.
  • Аналогично для кнопки с номером 2, но тут мы указали число столбцов, которое она заполняет, через ColumnSpan. Номер ряда у неё 0, поэтому отдельно Grid.Row можно не указывать.

StackPanel

Мой любимый контейнер. Как и следует из названия, элементы просто складываются друг за другом (по вертикали или горизонтали), в зависимости от выбранной ориентации (по умолчанию вертикальной). Он нравится мне, потому что можно не запариваться с разметкой окна, а просто складывать элементы подряд, и они будут стоять относительно ровно. Если в вертикальный StackPanel добавить горизонтальный StackPanel, то в каком-то ряду элементы встанут по горизонтали. Profit!

-3

В общем, кажется, что тут всё просто и очевидно

DockPanel

Довольно интересный контейнер для сложных оконных интерфейсов. Суть тут в том, что мы как бы "прижимаем" элемент к краю окна с помощью свойства DockPanel.Dock, и он заполняет отведённое ему пространство. Тут важно учитывать порядок элементов в окне. Элемент занимает нужное ему место, а следующий элемент стремиться занять всё оставшееся свободным место, но не претендует на место верхнего элемента. Пример:

-4
  • Сначала мы прижали 4 кнопки к низу окна.
  • Затем Button0 заняла всё нужное ей место по ширине, но по высоте прижалась к левому краю только до верха StackPanel.
  • Следом Button1 заняла верхний ряд, но не залезая на уже занятые территории
  • Оставшееся место взяла Button2

Заключение

В 99% случаев в реальном программировании под Revit я использовал только эти контейнеры. Если вам интересно узнать что-либо про другие контейнеры или другие аспекты WPF, пишите в комментарии, что именно вас интересует, постараюсь разобрать в следующих статьях.

И не забывайте подписываться на мой телеграм-канал о Revit API. До новых встреч!

-5