Взаимодействие XAML и C#

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

При добавлении новой страницы XAML в проект также одновременно добавляется файл кода C#. Так, при создании проекта в него по умолчанию добавляется файл с графическим интерфейсом в XAML - MainPage.xaml и файл MainPage.xaml.cs, где, как предполагается, должна находится логика приложения, связанная с разметкой из файла XAML.

Взаимодействие кода Xaml и C# в .NET MAUI

Файлы 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";

В итоге по нажатию на кнопку у нее изменится текст.

Взаимодействие кода C# и интерфейса в XAML в .NET MAUI
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850