Даже самое простое приложение содержит несколько страниц. Минимально — это основная страница и страница с настройками. В данной статье я покажу пример как реализовать переключение между страницами с помощью класса NavigationPage.
Этот класс организует навигацию между страницами приложения по методу стека. Т.е. каждый раз добавляя страницу в стек, вы делаете её активной. Пользователь при этом может воспользоваться навигационными клавишами устройства, чтобы вернуться к предыдущей странице приложения.
При инициализации приложения нужно добавить основную страницу в стек.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace Demo_Line { public partial class App : Application { public App() { InitializeComponent(); MainPage = new NavigationPage(new MainPage()); } } } |
MainPage — это класс, описывающий одну из страниц вашего приложения. Вот с таким xaml кодом:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:skia="clr-namespace:SkiaSharp.Views.Forms;assembly=SkiaSharp.Views.Forms" x:Class="Demo_Line.MainPage" Title="Demo Running Lines" Appearing="OnAppearing"> <Grid BackgroundColor="Black"> <skia:SKCanvasView x:Name="canvasView" EnableTouchEvents="True" PaintSurface="OnCanvasViewPaintSurface" Touch="OnTouch" /> </Grid> </ContentPage> |
Как видите основным компонентом страницы является SKCanvasView, который обрабатывает события Touch. На него мы и добавим код переключения на другую страницу.
Я привожу здесь только интересующую нас часть кода, а именно обработку события Touch, с переключением на другую страницу.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; using Xamarin.Forms; using SkiaSharp; using SkiaSharp.Views.Forms; using Xamarin.Essentials; namespace Demo_Line { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); ... } private void OnTouch(object sender, SKTouchEventArgs e) { switch (e.ActionType) { case SKTouchAction.Pressed: // Переключаемся на другую страницу Navigation.PushAsync(new SettingsPage()); break; } // we have handled these events e.Handled = true; } void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args) { ... } } } |
Если вам хотите закрыть текущую страницу, чтобы приложение вернулось к предыдущей, то вам нужно будет выполнить метод Navigation.PopAsync();
Представьте, что на второй странице есть кнопка, сохраняющая данные и закрывающая страницу, тогда код мог бы выглядеть примерно так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; using Xamarin.Essentials; namespace Demo_Line { public partial class SettingsPage : ContentPage { public SettingsPage() { InitializeComponent(); } private void OnCloseButtonClicked(object sender, EventArgs e) { // какая работа по сохранению данных ... // вернемся к предыдущей странице приложения Navigation.PopAsync(); } } } |