Содержание
В XAML элементы могут содержать достаточно большое количество различных свойств, но только часть из них отвечает за размеры и позиционирование элемента, то есть за то где и как будет расположен XAML-элемент. В этой части мы рассмотрим основные Свойства размеров и позиционироваться XAML-элементов.
Свойства размеров и позиционироваться XAML-элементов
Свойства размеров XAML-элементов
В WPF за размеры элемента отвечают следующие свойства:
Свойство | Тип | Описание |
ActualHeight |
double |
Текущая высота элемента в единицах, не зависящих от устройства (1/96 дюйма на единицу). Значение по умолчанию равно 0 (нулю). |
Actual |
double |
Текущая высота элемента в независимых единицах. По умолчанию равна нулю. |
Height |
double |
Возвращает или задает рекомендуемую высоту элемента |
Width |
double |
Возвращает или задает рекомендуемую ширину элемента |
MinHeight |
double |
Минимально допустимая высота элемента |
MaxHeight |
double |
Максимально допустимая высота элемента |
MinWidth |
double |
Минимально допустимая ширина элемента |
MaxWidth |
double |
Максимально допустимая ширина элемента |
Среди этих свойств тройки свойств: Height
, MinHeight
иMaxHeight
, а также Width, MinWidth
и MaxWidth
связаны между собой. Так, значения Height и Width не учитываются при построении макета приложения, если их значения выходят за пределы, установленные свойствами MinHeight
/MaxHeight и MinWidth / MaxWidth
соответственно.
Например, создадим новое приложение WPF и добавим на страницу MainWindow.xaml следующую кнопку:
<Button Height="30" Width="130" MaxHeight="20" MinHeight="10"/>
Здесь значение свойства Height
выходит за пределы, установленные свойством MaxHeight
, поэтому значение Height
будет проигнорировано, а высота кнопки будет равна 20. Рассмотрим другой пример:
<Button Height="40" Width="130" MaxHeight="20" MinHeight="30"/>
здесь свойство MaxHeight
меньше, чем MinHeight
. Платформа WPF устанавливает высоту элемента следующим образом: начала проверяется значение MinHeight
, затем MaxHeight
и только, если значение Height
находится в диапазоне значение между MinHeight
и MaxHeight
оно будет применено к элементу. В приведенном выше примере высота элемента будет установлена равной 30 так как возникает конфликт между MinHeight
и MaxHeight
, а MinHeight
проверяется в первую очередь. Аналогичным образом выполняется и вычисление ширины элемента, а свойства ActualHeight
и Actual
содержат установленную в итоге высоту или ширину элемента.
Единицы измерения размеров XAML-элементов
Свойства размеров XAML-элементов в WPF мы можем задавать, используя различные единицы измерения. По умолчанию, в WPF используют независимые от разрешения единицы (px) 1px = 1/96 дюйма. Также, могут использоваться следующие единицы измерения:
in
— дюймы;1in = 96 пикселей
cm
— сантиметры;1cm =(96/2.54) px
pt
— точки;1pt=(96/72) px
Единицы измерения указываются сразу после значения (без использования пробела). Например,
<Button Content="Кнопка" Width="1in"/>
здесь ширина кнопки задана равной одному дюйму.
Свойства позиционирования XAML-элементов
Теперь рассмотрим основные свойства позиционирования XAML-элементов.
Свойство | Тип | Описание |
HorizontalAlignment |
HorizontalAlignment |
Определяет горизонтальное положение XAML-элемента внутри контейнера. Это свойство учитывается в том случае, если существует возможность горизонтального перемещения элемента внутри контейнера |
VerticalAlignment |
VerticalAlignment |
Определяет вертикальное положение XAML-элемента внутри контейнера. Это свойство учитывается в том случае, если существует возможность вертикального перемещения элемента внутри контейнера |
Margin |
Thickness |
Определяет внешние отступы вокруг XAML-элемента |
Padding |
Thickness |
Определяем внутренние отступы элемента. Это свойство имеется только у тех элементов, которые могут иметь какое-либо содержимое. |
Свойства VerticalAlignment и HorizontalAlignment
Значением свойства HorizontalAlignment
является перечисление, у которого определены следующие поля:
Поле | Значение | Описание |
Left |
0 |
Элемент выравнивается по левому краю контейнера |
Center |
1 |
Элемент выравнивается по центру контейнера |
Right |
2 |
Элемент выравнивается по левому правому контейнера |
Stretch |
3 |
Элемент растягивается по ширине (значение по умолчанию) |
Width
) элемента имеет приоритет над значением свойства HorizontalAlignment
То есть, если вы установите и значение HorizontalAlignment
и Width
, то, в первую очередь, изменится ширина элемента, а уже затем элемент будет выравнен по горизонталиВ свою очередь, свойство VerticalAlignment
может принимать следующие значения:
Поле | Значение | Описание |
Top |
0 |
Элемент выравнивается по верхней границе контейнера |
Center |
1 |
Элемент выравнивается по центру контейнера |
Bottom |
2 |
Элемент выравнивается по нижней границе контейнера |
Stretch |
3 |
Элемент растягивается по высоте контейнера (значение по умолчанию) |
Как и ширина, свойство высоты (Height
) имеет приоритет над свойством VerticalAlignment
Свойства Margin и Padding
Чтобы продемонстрировать работу свойств Margin
и Padding
, изменим код MainWindow.xaml следующим образом:
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" Background="Blue"> <Grid> <Border Background="Red"> <Button Content="Кнопка" HorizontalAlignment="Stretch" Height="40" Width="50"/> </Border> </Grid> </Window>
Теперь наша кнопка находится внутри элемента Border (рамка) и, при этом, фон окна установлен как красный, а для рамки фон — синий. В визуальном редакторе это будет выглядеть следующим образом:
Так как для
Border
мы не устанавливали свойств размеров и позиционирования, то по умолчанию рамка растянулась на всё доступное пространство окна и мы не видим синюю заливку. Теперь уберем все свойства позиционирования и размеров для кнопки, чтобы она также растянулась на всё доступное пространство Border
:
<Button Content="Кнопка"/>
Вначале продемонстрируем работу свойства Padding
— это свойство устанавливает внутренние отступы. Например, изменим это свойство для Border
следующим образом:
<Border Background="Red" Padding="30"> <Button Content="Кнопка"/> </Border>
Здесь мы установили для Border
все четыре внутренних отступа (слева, сверху, снизу и справа) по 30 единиц. Теперь наше окно будет выглядеть вот так:
Теперь мы видим часть Border
. Аналогичным образом мы можем установить внешние отступы, используя свойство Margin. Это приведет к тому, что сам элемент Border будет изменять свои размеры и мы увидим синюю заливку (фон окна). Например,
<Border Background="Red" Padding="30" Margin="50"> <Button Content="Кнопка"/> </Border>
Свойства
Margin
и Padding
можно указывать различными способами. Так, в примере выше, мы указали для этих свойств по одному значению. Это означает, что по всем сторонам элемента будут установлены равные отступы. Изменим значение Margin
следующим образом:
<Border Background="Red" Padding="30" Margin="50,10,20,20"> <Button Content="Кнопка"/> </Border>
Здесь мы отдельно указали отступ слева, сверху, справа и снизу. В результате окно примет следующий вид:
Итого
По умолчанию XAML-элементы пытаются занять всё доступное пространство в контейнере так как их свойства HorizontalAlignment
и VerticalAlignment
имеют значение Stretch
. При этом, мы можем управлять размерами и позиционированием элементов, используя свойства размеров и положения элемента внутри контейнера.