По умолчанию в созданном в прошлой теме проекте у нас уже есть минимальный код, необходимый для приложения. Само выполнение приложения начинается с файлов App.xaml и App.xaml.cs.
Так, если мы откроем файл App.xaml.cs, то увидим там следующий класс:
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; namespace HelloApp { public partial class App : Application { public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { } protected override void OnSleep() { } protected override void OnResume() { } } }
Это обычный файл с кодом C#. Фактически единственно, что он делает, это устанавливает главную страницу приложения через свойство
MainPage
в конструкторе.
В качестве главной страницы устанавливается объект класса MainPage, то есть единственная определенная в проекте страница.
Перейдем к определению этой страницы. Оно разбито на два файла. Файл MainPage.xaml представляет визуальный интерфейс страницы в виде кода XAML (как и в WPF/UWP), который аналогичен HTML:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="HelloApp.MainPage"> <StackLayout> <Frame BackgroundColor="#2196F3" Padding="24" CornerRadius="0"> <Label Text="Welcome to Xamarin.Forms!" HorizontalTextAlignment="Center" TextColor="White" FontSize="36"/> </Frame> <Label Text="Start developing now" FontSize="Title" Padding="30,10,30,10"/> <Label Text="Make changes to your XAML file and save to see your UI update in the running app with XAML Hot Reload. Give it a try!" FontSize="16" Padding="30,0,30,0"/> <Label FontSize="16" Padding="30,24,30,0"> <Label.FormattedText> <FormattedString> <FormattedString.Spans> <Span Text="Learn more at "/> <Span Text="https://aka.ms/xamarin-quickstart" FontAttributes="Bold"/> </FormattedString.Spans> </FormattedString> </Label.FormattedText> </Label> </StackLayout> </ContentPage>
Так как для создания страниц используется класс ContentPage, то в качестве корневого элемента в этом файле определен именно элемент ContentPage.
Все его содержимое состоит из элемента StackLayout, который позволяет расположить вложенные элементы в виде вертикального стека.
Внутри StackLayout определен ряд элементов, которые собственно определяют видимые на экране элемента. В данном случае в основном это
элементы Label, которые служат для вывода простого или отформатированного текста на экран. Текст задается с помощью
атрибута Text
.
Также в проекте есть и файл с кодом логики страницы - файл MainPage.xaml.cs:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Xamarin.Forms; namespace HelloApp { public partial class MainPage : ContentPage { public MainPage() { InitializeComponent(); } } }
Однако по факту здесь никакой логики нет, кроме вызова в конструкторе InitializeComponent()
. Через этот вызов на странице формируется интерфейс,
который определен в файле MainPage.xaml.
Стоит отметить, что чтобы связать оба определения страницы, класс MainPage определяется здесь как частичный (partial), а в файле MainPage.xaml в определении страницы ContentPage указан класс, название которого совпадает с классом из MainPage.xaml.cs:
x:Class="HelloApp.MainPage"
К классу применяется атрибут DesignTimeVisible, который позволяет в процессе разработки в Visual Studio в режиме превью увидеть созданный интерфейс.
Главный проект со всеми рассмотренными выше файлами компилируется в библиотеку dll, а остальные три проекта содержат ссылки на него. Так, если мы откроем узел References у каждого проекта,
то увидим там ссылку на библиотеку HelloApp
- то есть ссылку на главный проект.
Кроме этой библиотеки все три остальных проекта содержат еще ряд важных ссылок, в частности каждый проект содержит ссылку на свою специфическую библиотеку:
Xamarin.Forms.Platform.Android
Xamarin.Forms.Platform.iOS
Universal Windows
Данные библиотеки определяют для своей мобильной платформы статический метод Xamarin.Forms.Init()
, который выполняет инициализацию
системы Xamarin.Forms.
Например, возьмем проект для Android. В нем по умолчанию имеется файл MainActivity.cs, с которого собственно начинается выполнение проекта на Android:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); } // остальной код }
Прежде всего обратим внимание на две обязательные строки:
Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
Здесь производится инициализация платформ Xamarin.Essentials и Xamarin.Forms.
Затем экземпляр класса App передается в метод LoadApplication()
, который определен у класса Xamarin.Forms.Platform.Android.FormsAppCompatActivity, и собственно происходит запуск приложения Xamarin Forms.
LoadApplication(new App());
В проекте для iOS вызов приложеения xf будет происходить в классе AppDelegate в его методе FinishedLaunching:
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate { public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.Init(); LoadApplication(new App()); return base.FinishedLaunching(app, options); } }
Вызов global::Xamarin.Forms.Forms.Init()
инициализирует Xamarin Forms, а вызов LoadApplication(new App())
запускает
приложение XF на выполнение.
А в проекте для UWP все подобные действия разбиты на два этапа. Прежде всего, в в файле App.xaml.cs в методе OnLaunched()
:
определена инициализация Xamarin Forms:
protected override void OnLaunched(LaunchActivatedEventArgs e) { Frame rootFrame = Window.Current.Content as Frame; if (rootFrame == null) { rootFrame = new Frame(); rootFrame.NavigationFailed += OnNavigationFailed; Xamarin.Forms.Forms.Init(e); // инициализация Xamarin Forms // ... остальной код } // .... остальной код }
А в файле MainPage.xaml.cs поизводится запуск приложения:
public sealed partial class MainPage { public MainPage() { this.InitializeComponent(); LoadApplication(new HelloApp.App()); // вызов приложения Xamarin Forms } }
Итак, фактически наш проект по умолчанию уже представляет простейшее приложение, которое просто выводит на экран некоторый текст. И теперь рассмотрим, как мы можем запускать приложение на разных ОС.