В 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-элемента по горизонтали и вертикали, а также устанавливать внешние и внутренние отступы для элемента.