Что такое 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="Главная">
<StackLayout Padding="20">
<Label Text="Добро пожаловать!" FontSize="24" />
<Button Text="Нажми" />
</StackLayout>
</ContentPage>
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">
<TabBar>
<ShellContent Title="Главная" ContentTemplate="{DataTemplate local:MainPage}" />
<ShellContent Title="Профиль" ContentTemplate="{DataTemplate local:ProfilePage}" />
</TabBar>
</Shell>
Переход по маршруту:
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 страницы — это основа навигации, компоновки и взаимодействия пользователя с приложением. Они позволяют реализовать широкий спектр интерфейсов: от простых экранов до многоуровневых навигационных схем, встроенных меню и адаптивных макетов. Каждый тип страницы подходит для определённого сценария и может комбинироваться с другими в пределах одного приложения.