Процесс компоновки

46

Компоновка WPF происходит в два этапа: этап измерения и этап расстановки. На этапе измерения контейнер выполняет проход в цикле по дочерним элементам и опрашивает их предпочтительные размеры. На этапе расстановки контейнер помещает дочерние элементы в соответствующие позиции.

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

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

Все контейнеры компоновки WPF являются панелями, которые унаследованы от абстрактного класса System.Windows.Controls.Panel. Пространство имен System.Windows.Controls предлагает многочисленные панели, каждая из которых по-своему обслуживает внутренние элементы. Используя панели, вы сможете устанавливать поведение элементов управления при изменении размеров окна пользователем — будут они оставаться в том же месте, куда были помещены во время проектирования, будут располагаться свободным потоком слева направо или сверху вниз, и т.д.

Иерархия класса Panel

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

Класс Panel добавляет небольшой набор членов, включая три общедоступных свойства, описанные ниже:

Background

Кисть, используемая для рисования фона панели. Чтобы принимать события мыши, это свойство должно быть установлено в отличное от null значение. (Если вы хотите принимать события мыши, но не желаете отображать сплошной фон, просто установите прозрачный цвет фона — Transparent.)

Children

Коллекция элементов, находящихся в панели. Это первый уровень элементов — другими словами, это элементы, которые сами могут содержать в себе другие элементы.

IsItemsHost

Булевское значение, которое равно true, если панель используется для отображения элементов, ассоциированных с ItemsControl (вроде узлов в TreeView или элементов списка ListBox). Большую часть времени вы даже не будете знать о том, что элемент управления списком используется "за кулисами" панелью для управления компоновкой элементов. Однако эта деталь становится более важной, если вы хотите создать специальный список, который будет располагать свои дочерние элементы другим способом (например, ListBox, отображающий графические изображения).

Класс Panel также имеет внутренний механизм, который можно использовать при создании собственного контейнера компоновки. Но важнее то, что можно переопределить методы MeasureOverride() и ArrangeOverride(), унаследованные от FrameworkElement, для изменения способа обработки панелью этапов измерения и расстановки при организации дочерних элементов.

Сам по себе базовый класс Panel — это не что иное, как начальная точка для построения других более специализированных классов. WPF предлагает набор производных от Panel классов, которые можно использовать для организации компоновки. Наиболее основные из них перечислены ниже. Как и все элементы управления WPF, а также большинство визуальных элементов, эти классы находятся в пространстве имен System.Windows.Controls:

StackPanel

Размещает элементы в горизонтальном или вертикальном стеке. Этот контейнер компоновки обычно используется в небольших разделах крупного и более сложного окна

WrapPanel

Размещает элементы в последовательностях строк с переносом. В горизонтальной ориентации WrapPanel располагает элементы в строке слева направо, затем переходит к следующей строке. В вертикальной ориентации WrapPanel располагает элементы сверху вниз, используя дополнительные колонки для дополнения оставшихся элементов

DockPanel

Выравнивает элементы по краю контейнера

Grid

Выстраивает элементы в строки и колонки невидимой таблицы. Это один из наиболее гибких и широко используемых контейнеров компоновки

UniformGrid

Помещает элементы в невидимую таблицу, устанавливая одинаковый размер для всех ячеек. Данный контейнер компоновки используется нечасто

Canvas

Позволяет элементам позиционироваться абсолютно — по фиксированным координатам. Этот контейнер компоновки более всего похож на традиционный компоновщик Windows Forms, но не предусматривает средств привязки и стыковки. В результате это неподходящий выбор для окон переменного размера, если только вы не собираетесь взвалить на свои плечи значительный объем работы

Наряду с этими центральными контейнерами существует еще несколько более специализированных панелей, которые встречаются во многих элементах управления. К ним относятся панели, предназначенные для хранения дочерних элементов определенного элемента управления, такого как TabPanel (вкладки в TabControl), ToolbarPanel (кнопки в Toolbar) и ToolbarOverflowPanel (команды в раскрывающемся меню Toolbar). Имеется еще VirtualizingStackPanel, список элементов управления с привязкой данных которого используется для существенного сокращения накладных расходов, а также InkCanvas, который подобен Canvas, но обладает поддержкой перьевого ввода на Tablet PC. (Например, в зависимости от выбранного режима, InkCanvas поддерживает рисование с указателем для выбора экранных элементов. Хотя это не очень удобно, но InkCanvas можно использовать и на обычном компьютере с мышью.)

Пройди тесты
Лучший чат для C# программистов