Создание приложения

Последнее обновление: 07.01.2021

По умолчанию в созданном в прошлой теме проекте у нас уже есть минимальный код, необходимый для приложения. Само выполнение приложения начинается с файлов 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

Например, возьмем проект для 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

В проекте для 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

А в проекте для 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
	}
}

Итак, фактически наш проект по умолчанию уже представляет простейшее приложение, которое просто выводит на экран некоторый текст. И теперь рассмотрим, как мы можем запускать приложение на разных ОС.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850