Что такое Page и какие типы страниц бывают в Xamarin.Forms?

Page в Xamarin.Forms — это базовый строительный блок пользовательского интерфейса на уровне экрана. Каждый экран или окно в мобильном приложении создаётся как отдельный объект, производный от класса Page. Страницы представляют собой контейнеры, в которых размещаются элементы интерфейса, такие как кнопки, метки, поля ввода, списки и другие визуальные компоненты.

Page выполняет роль View в архитектуре MVVM и взаимодействует с ViewModel через механизм привязки данных (Data Binding). Все страницы наследуются от абстрактного класса Xamarin.Forms.Page.

Назначение Page в Xamarin.Forms

  • Обеспечивает визуальное отображение одного логического экрана приложения.

  • Может содержать один или несколько layout-контейнеров, в которые вкладываются элементы UI.

  • Управляет навигацией между экранами.

  • Поддерживает жизненный цикл, события загрузки, появления и исчезновения страницы (OnAppearing, OnDisappearing).

  • Может быть частью навигационного стека, табов или мастер-меню.

Основные типы страниц в Xamarin.Forms

1. ContentPage

ContentPage — наиболее распространённый тип страницы. Предназначен для отображения одного содержимого (контейнера), обычно с использованием одного основного layout-контейнера (StackLayout, Grid, ScrollView и т.п.).

Особенности:

  • Используется для большинства стандартных экранов.

  • Поддерживает простой и гибкий макет.

  • Можно использовать прокрутку с помощью ScrollView.

Пример:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
x:Class="MyApp.MainPage"
Title="Главная">
&lt;StackLayout Padding="20"&gt;
&lt;Label Text="Добро пожаловать!" FontSize="24" /&gt;
&lt;Button Text="Нажми" /&gt;
&lt;/StackLayout&gt;
&lt;/ContentPage&gt;

2. NavigationPage

NavigationPage используется для создания иерархической навигации между страницами (в виде стека). При переходе на новую страницу, она помещается на вершину стека, а при возврате — удаляется.

Особенности:

  • Поддерживает заголовки (Title) и кнопку "Назад".

  • Использует стек навигации: PushAsync() и PopAsync() для переходов.

Пример создания в C#:

MainPage = new NavigationPage(new MainPage());

Пример перехода:

await Navigation.PushAsync(new DetailPage());

3. TabbedPage

TabbedPage — это страница с вкладками, каждая из которых может содержать собственную страницу. Используется для создания интерфейсов с несколькими логическими разделами, переключаемыми через вкладки (например, «Главная», «Поиск», «Настройки»).

Особенности:

  • Вкладки отображаются внизу (iOS) или вверху (Android).

  • Каждая вкладка — это отдельная Page.

Пример:

public class App : Application
{
public App()
{
MainPage = new TabbedPage
{
Children =
{
new MainPage { Title = "Главная" },
new SettingsPage { Title = "Настройки" }
}
};
}
}

4. MasterDetailPage (устаревший термин, заменён на FlyoutPage)

FlyoutPage (ранее MasterDetailPage) — используется для реализации бокового меню (гамбургер-меню), особенно популярного на Android. Меню (Flyout) содержит список навигационных пунктов, а основной экран (Detail) отображает содержимое выбранного пункта.

Особенности:

  • Flyout может быть ListView или StackLayout со списком страниц.

  • Detail — это обычно NavigationPage с текущей выбранной страницей.

Пример (C#):

public class MyFlyoutPage : FlyoutPage
{
public MyFlyoutPage()
{
Flyout = new MenuPage(); // боковое меню
Detail = new NavigationPage(new MainPage()); // основное содержимое
}
}

5. CarouselPage

CarouselPage — страница, которая позволяет перелистывать контент свайпами влево и вправо. Каждая "страница" внутри CarouselPage — это ContentPage. Часто используется для создания презентаций, галерей, onboarding-интерфейсов.

Особенности:

  • Поддерживает свайпы.

  • Удобна для последовательного представления информации.

  • Может быть горизонтальной или вертикальной (на Android).

Пример:

MainPage = new CarouselPage
{
Children =
{
new ContentPage { Content = new Label { Text = "Страница 1" } },
new ContentPage { Content = new Label { Text = "Страница 2" } }
}
};

6. Shell (AppShell)

Shell — это более современный способ организации навигации и структуры приложения, предложенный в поздних версиях Xamarin.Forms. Позволяет объединить навигацию, вкладки, боковое меню и маршруты в единую декларативную модель.

Особенности:

  • Поддержка маршрутов (routing), глубоких ссылок, анимации переходов.

  • Упрощённая навигация.

  • Структура задаётся в XAML или C# через Shell.

Пример AppShell.xaml:

<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyApp.AppShell">
&lt;TabBar&gt;
&lt;ShellContent Title="Главная" ContentTemplate="{DataTemplate local:MainPage}" /&gt;
&lt;ShellContent Title="Профиль" ContentTemplate="{DataTemplate local:ProfilePage}" /&gt;
&lt;/TabBar&gt;
&lt;/Shell&gt;

Переход по маршруту:

await Shell.Current.GoToAsync("//profile");

Сравнительная таблица типов страниц

Тип страницы Назначение Особенности
ContentPage Обычный экран Один layout-контейнер, основной тип страницы
--- --- ---
NavigationPage Иерархическая навигация Стек страниц, кнопка "Назад"
--- --- ---
TabbedPage Вкладки Несколько страниц, переключение по вкладкам
--- --- ---
FlyoutPage Боковое меню Разделение на меню и содержимое
--- --- ---
CarouselPage Перелистывание контента Свайпы между экранами, часто используется в intro
--- --- ---
Shell Модульная навигация Поддержка маршрутов, меню, вкладок, упрощённая структура
--- --- ---

Жизненный цикл страницы

Каждая страница имеет собственные методы жизненного цикла:

  • OnAppearing() — вызывается, когда страница отображается на экране.

  • OnDisappearing() — вызывается, когда страница уходит из видимости.

Это позволяет выполнять действия загрузки, освобождения ресурсов, подписки на события и т.д.

Пример:

protected override void OnAppearing()
{
base.OnAppearing();
// Загрузка данных
}

Навигация между страницами

Xamarin.Forms предоставляет API для переходов между страницами:

NavigationPage:

await Navigation.PushAsync(new DetailPage()); // открыть
await Navigation.PopAsync(); // вернуться назад

Shell:

await Shell.Current.GoToAsync("//home/details");

Создание страниц в XAML и C#

Любую страницу можно создать:

  • Декларативно (XAML + .xaml.cs)

  • Программно (чистый C#)

Пример страницы на чистом C#:

public class HelloPage : ContentPage
{
public HelloPage()
{
Content = new StackLayout
{
Children =
{
new Label { Text = "Привет!" },
new Button { Text = "Нажми" }
}
};
}
}

В Xamarin.Forms страницы — это основа навигации, компоновки и взаимодействия пользователя с приложением. Они позволяют реализовать широкий спектр интерфейсов: от простых экранов до многоуровневых навигационных схем, встроенных меню и адаптивных макетов. Каждый тип страницы подходит для определённого сценария и может комбинироваться с другими в пределах одного приложения.