При добавлении новой страницы XAML в проект также одновременно добавляется файл кода C#. Так, при создании проекта в него по умолчанию добавляется файл с графическим интерфейсом в XAML - MainPage.xaml и файл MainPage.xaml.cs, где, как предполагается, должна находится логика приложения, связанная с разметкой из файла XAML.
Файлы XAML позволяют нам определить интерфейс окна, но для создания логики приложения, например, для определения обработчиков событий элементов управления, нам все равно придется воспользоваться кодом C#.
По умолчанию в файле XAML определен атрибут x:Class:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="HelloApp.MainPage"> <ScrollView> <VerticalStackLayout Padding="30,0" Spacing="25"> <Image Source="dotnet_bot.png" HeightRequest="185" Aspect="AspectFit" SemanticProperties.Description="dot net bot in a race car number eight" /> <Label Text="Hello, World!" Style="{StaticResource Headline}" SemanticProperties.HeadingLevel="Level1" /> <Label Text="Welcome to .NET Multi-platform App UI" Style="{StaticResource SubHeadline}" SemanticProperties.HeadingLevel="Level2" SemanticProperties.Description="Welcome to dot net Multi platform App U I" /> <Button x:Name="CounterBtn" Text="Click me" SemanticProperties.Hint="Counts the number of times you click" Clicked="OnCounterClicked" HorizontalOptions="Fill" /> </VerticalStackLayout> </ScrollView> </ContentPage>
Атрибут x:Class="HelloApp.MainPage
указывает на класс, который будет представлять данную страницу и в который будет компилироваться код в XAML
при компиляции. То есть во время компиляции будет генерироваться класс HelloApp.MainPage
, унаследованный от класса ContentPage.
Также следует отметить определение кнопки в коде XAML:
<Button x:Name="CounterBtn" Text="Click me" SemanticProperties.Hint="Counts the number of times you click" Clicked="OnCounterClicked" HorizontalOptions="Fill" />
А именно здесь нас будет интересовать два атрибута. С помощью атрибута x:Name элементу назначается имя. При компиляции приложения будет создаваться приватная переменная с этим именем.
Второй атрибут - Clicked устанавливает обработчик нажатия кнопки. Он имеет значение "OnCounterClicked", а это значит, что в коде C# должен быть определен метод с данным именем, который будет обрабатывать нажатия данной кнопки.
Теперь рассмотрим, как мы можем использовать элементы из XAML в коде C#. Для этого откроем связанный со страницей MainPage.xaml файл кода MainPage.xaml.cs, который по умолчанию имеет следующий код:
namespace HelloApp { public partial class MainPage : ContentPage { int count = 0; public MainPage() { InitializeComponent(); } private void OnCounterClicked(object sender, EventArgs e) { count++; if (count == 1) CounterBtn.Text = $"Clicked {count} time"; else CounterBtn.Text = $"Clicked {count} times"; SemanticScreenReader.Announce(CounterBtn.Text); } } }
Во время компиляции этот класс объединяется с классом, сгенерированным из кода XAML. Чтобы такое слияние классов во время компиляции произошло, класс MainPage определяется как частичный с модификатором partial. А через метод InitializeComponent() класс MainPage вызывает скомпилированный ранее код XAML, разбирает его и по нему строит графический интерфейс страницы.
Выше в коде xaml обработчик кнопки через атрибут Clicked связывался с методом OnCounterClicked. И здесь мы видим данный метод. При нажатии он увеличивает значение переменной count, которая хранит количество нажатий. И затем изменяет текст кнопки.
Поскольку в коде xaml для кнопки задано имя CounterBtn, то в коде C# мы можем обратиться к ее функционалу, в частности, к свойству Text для изменения текста на ней.
CounterBtn.Text = $"Clicked {count} time";
В итоге по нажатию на кнопку у нее изменится текст.