В XAML элементы могут иметь достаточно большое количество различных свойств. Однако только часть из них отвечает за размеры и позиционирование элемента, то есть за то где XAML-элемент будет расположен и как. В этой части мы рассмотрим основные свойства размеров и позиционироваться XAML-элементов.
Свойства размеров XAML-элементов
Вначале рассмотрим свойства размеров XAML-элементов, основные из которых показаны в таблице ниже.
| Свойство | Объявление | Описание |
Height |
public double Height { get; }
|
Возвращает текущую высоту элемента |
Width |
public double Width { get; }
|
Возвращает текущую ширину элемента |
HeightRequest |
public double HeightRequest { get; set; }
|
Возвращает или задает требуемую высоту элемента. Это значение будет применено к элементу при очередном построении макета приложения. По умолчанию значение этого свойства равно -1. |
WidthRequest |
public double WidthRequest { get; set; }
|
Возвращает или задает требуемую ширину элемента. Это значение будет применено к элементу при очередном построении макета приложения. По умолчанию значение этого свойства равно -1. |
MaximumHeightRequest |
public double MaximumHeightRequest { get; set; }
|
Возвращает или задает максимальную высоту, запрашиваемую элементом во время построения макета. MaximumHeightRequest гарантирует, что высота элемента не превысит указанного в свойстве значения |
MaximumWidthRequest |
public double MaximumWidthRequest { get; set; }
|
Возвращает или задает максимальную ширину, запрашиваемую элементом во время построения макета. MaximumWidthRequest гарантирует, что ширина элемента не превысит указанного в свойстве значения |
MinimumHeightRequest |
public double MinimumHeightRequest { get; set; }
|
Возвращает или задает минимальную высоту, запрашиваемую элементом во время построения макета. MinimumHeightRequest гарантирует, что высота элемента будет не менее указанного в свойстве значения |
MinimumWidthRequest |
public double MinimumWidthRequest { get; set; }
|
Возвращает или задает минимальную ширину, запрашиваемую элементом во время построения макета. MinimumWidthRequest гарантирует, что ширина элемента будет не менее указанного в свойстве значения |
По умолчанию, при построении макета приложения учитываются не только указанные выше свойства XAML-элемента, но и свойства элемента, который выступает в роли контейнера содержимого. Так, если XAML-элемент помещается непосредственно на страницу приложения, то он растягивается таким образом, чтобы занять всё доступное пространство. Например, создадим новое приложение .NET MAUI и изменим код страницы MainPage.xaml следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp2.MainPage">
<Button Text="Click Me"/>
</ContentPage>
Здесь кнопка (Button) размещена непосредственно на странице ContentPage. Поэтому, если мы запустим приложение, то увидим следующее расположение кнопки:
Теперь воспользуемся свойствами HeightRequest и WidthRequest, чтобы изменить высоту и ширину кнопки:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp2.MainPage">
<Button Text="Click Me"
HeightRequest="30"
WidthRequest="120"/>
</ContentPage>
Теперь кнопка будет также пытаться растянуться на всё доступное пространство страницы, но благодаря установленным свойствам длины и ширины, её размеры будут ограничены. В результате мы увидим, что наша кнопка будет расположена точно по центру страницы:
Свойства HeightRequest и WidthRequest игнорируются, если их значения выходят за пределы, установленные свойствами MaximumHeightRequest,MaximumWidthRequest, MinimumHeightRequest и MinimumWidthRequest. Например, изменим объявление нашей кнопки следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp2.MainPage">
<Button Text="Click Me"
HeightRequest="60"
WidthRequest="120"
MaximumHeightRequest="30"
MaximumWidthRequest="30"
MinimumHeightRequest="5"
MinimumWidthRequest="5"/>
</ContentPage>
Теперь наша кнопка будет выглядеть следующим образом:
Что касается свойств Height и Width, то эти свойства только возвращают значение высоты и ширины элемента и воспользоваться ими возможно непосредственно в коде C# приложения.
Свойства позиционирования XAML-элементов
Теперь рассмотрим основные свойства позиционирования XAML-элементов.
| Свойство | Объявление | Описание |
HorizontalOptions |
public LayoutOptions HorizontalOptions { get; set; }
|
Определяет горизонтальное положение XAML-элемента внутри контейнера. |
VerticalOptions |
public LayoutOptions VerticalOptions { get; set; }
|
Определяет вертикальное положение XAML-элемента внутри контейнера. |
Margin |
public Thickness Margin { get; set; }
|
Определяет внешние отступы вокруг XAML-элемента |
Padding |
public Thickness Padding { get; set; }
|
Определяем внутренние отступы элемента. Это свойство имеется только у тех элементов, которые могут иметь какое-либо содержимое. |
Что касается свойств HorizontalOptions и VerticalOptions, то они представляют собой структуру Layout, которая содержит следующие поля:
| Поле | Описание |
Center |
XAML-элемент располагается по центру контейнера |
End |
XAML-элемент «прижимается» к правой границе контейнера |
Fill |
XAML-элемент «растягивается», занимая всё доступное пространство. Это значение игнорируется, если задано свойство HeightRequest или WidthRequest |
Start |
XAML-элемент «прижимается» к левой границе контейнера |
CenterAndExpand, EndAndExpand, FillAndExpand и StartAndExpand, однако эти поля отмечены как «устаревшие» и их использование в проекте нежелательноВернемся к нашему приложению и изменим свойства кнопки следующим образом:
<Button Text="Click Me"
WidthRequest="120"
HorizontalOptions="Fill"
VerticalOptions="Start" />
Обратите внимание — мы пытаемся «растянуть» кнопку по горизонтали, но одновременно с этим, задаем значение свойству WidthRequest. В результате, значение свойства HorizontalOptions будем проигнорировано и мы увидим на экране следующее расположение кнопки:
При этом, если убрать свойство WidthRequest, то кнопка растянется по всей ширине страницы:
<Button Text="Click Me"
HorizontalOptions="Fill"
VerticalOptions="Start" />
Чтобы продемонстрировать работу свойств Margin и Padding, изменим XAML-код страницы следующим образом:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp2.MainPage" >
<Border Background="Red"
Margin="50"
Padding="30">
<Button Text="Click Me"
HorizontalOptions="Fill"
VerticalOptions="Fill" />
</Border>
</ContentPage>
Теперь кнопка располагается внутри элемента Border, у которого установлен красный цвет фона (для наглядности), а также свойства Margin и Padding. Теперь запустим приложение и посмотрим на результат:
Свойства Margin и Padding можно указывать различными способами. Так, в примере выше, мы указали для этих свойств по одному значению. Это означает, что по всем сторонам элемента будут установлены равные отступы. Изменим значение Margin следующим образом:
<Border Background="Red"
Margin="50, 90"
Padding="30">
<Button Text="Click Me"
HorizontalOptions="Fill"
VerticalOptions="Fill" />
</Border>
Теперь первое значение в свойстве Margin определяет отступы слева и справа, а второе — сверху и снизу. И, наконец, мы можем указать все четыре отступа:
<Border Background="Red"
Margin="50, 90, 10, 100"
Padding="30">
<Button Text="Click Me"
HorizontalOptions="Fill"
VerticalOptions="Fill" />
</Border>
Здесь у свойства Margin:
- первое значение — отступ слева
- второе значение — отступ сверху
- третье значение — отступ справа
- четвертое значение — отступ снизу
Аналогичным образом мы можем менять значение и у свойства Padding.
Итого
По умолчанию XAML-элемент пытается занять всё доступное пространство контейнера в котором он располагается. При этом, мы можем изменять размеры элемента, устанавливать позиционирование XAML-элемента по горизонтали и вертикали, а также устанавливать внешние и внутренние отступы для элемента.



