Обработка событий в XAML
После создания пользовательского интерфейса XAML вы можете добавить код для реагирования на действия, происходящие при посещении страницы пользователем. .NET MAUI уведомляет приложение о вводимых пользователем данных и производимых им действиях посредством стандартных .NET событий.
В этом уроке вы узнаете, как обрабатывать эти события и выполнять ожидаемые пользователем операции.
Именование элементов на странице XAML
Код обработки событий часто должен ссылаться на определенные элементы управления и их свойства на странице. Каждому элементу управления можно присвоить уникальное имя. Для этого используйте вот этот атрибут XAML - x:Name
. Атрибут x:Name
выполняет два действия:
Он добавляет частное поле в созданный файл кода программной части, сопоставленный с этим элементом. Используйте это поле в коде для взаимодействия с визуальным элементом для задания свойств среды выполнения и обработки событий.
Он делает элемент известным для XAML с помощью этого имени. Вы можете ссылаться на эти элементы из других элементов, определенных в том же файле XAML.
Нельзя использовать произвольную строку при вводе имени элемента. Значение, назначенное атрибуту x:Name
, используется для создания в коде отдельного поля. Вместо этого он должен соответствовать соглашениям об именовании для переменной. Имя также должно быть уникальным, так как оно компилируется в определение программной части.
После того, как вы укажете имя для элемента, вы можете взаимодействовать с этим элементом в файле кода программной части. Следующий фрагмент XAML определяет элемент управления Label
. Он называется CounterLabel (этот пример взят из приложения по умолчанию, создается шаблон .NET MAUI):
<Label Text="Current count: 0"
...
x:Name="CounterLabel"
... />
В коде этой страницы можно ссылаться на этот элемент управления с помощью CounterLabel
поля и изменять его свойства:
count++;
CounterLabel.Text = $"Current count: {count}";
Внимание
Поле не может быть инициализировано до тех пор, пока на странице работает метод InitializeComponent
. Этот метод является частью процесса синтаксического анализа XAML и создания экземпляров объектов. Поместите любой код, который взаимодействует с элементом, определенным в XAML, после этого вызова. Исключением из этого правила является сам класс ContentPage
. Перед выполнением InitializeComponent
метода можно получить доступ ко всем свойствам класса. Но если в XAML вы задаете свойства в этом классе, значения этих свойств обновят все значения, которые вы задали при выполнении InitializeComponent
.
Использование атрибута для привязывания событий
Многие элементы управления предоставляют свойства, соответствующие событиям, на которые эти элементы управления могут реагировать, например событие Clicked
для кнопки. Различные элементы управления поддерживают различные наборы событий. Например, элемент управления Button
может реагировать на события Clicked
, Pressed
и Released
события, а элемент управления Entry
связан с такими событиями, как TextChanged
. Вы можете инициализировать свойство события в разметке XAML страницы и указать имя метода для запуска при активации события. Метод события должен соответствовать следующим требованиям сигнатуры:
- Он не может возвращать значение; метод должен быть
void
. - Он должен принимать два параметра: ссылку
object
, указывающую на объект, который инициирует событие (известный как отправитель), и параметрEventArgs
, содержащий все аргументы, передаваемые обработчику событий отправителем. - Обработчик событий должен быть скрытым -
private
. Это не применяется, но если вы делаете обработчик событий общедоступным, он становится доступным для внешнего мира, и действие, отличное от ожидаемого события, может вызвать его. - Обработчик событий может быть
async
, если необходимо выполнять асинхронные операции.
В следующем примере показано определение обработчика Clicked
событий для кнопки в примере приложения из шаблона .NET MAUI. Имя метода соответствует стандартному соглашению; За которым следует имя элемента управления (кнопка называется Счетчиком), а также имя события (щелчок). Стандартное соглашение не является обязательным, но рекомендуется как пример положительного опыта:
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
Разделение задач
Подключение событий в XAML удобно, но оно смешивает поведение элемента управления с определением пользовательского интерфейса. Многие разработчики предпочитают отличать эти элементы и выполнять все подписки обработчика событий в коде для именованных элементов. Проще увидеть, что привязывался и где сопоставляется поведение. Этот метод также затрудняет случайное прерывание кода путем удаления обработчика в XAML без его понимания. Компилятор не перехватывает удаленный обработчик, и он станет проблемой только в том случае, если код не выполняет это поведение должным образом.
Независимо от того, следует ли подключать обработчики событий с помощью XAML или использовать код, это вопрос личного выбора.
Чтобы подключить обработчик событий в коде, используйте оператор +=
для привязки к определенному событию. Обычно эта операция выполняется в конструкторе страницы после вызова InitializeComponent
:
public partial class MainPage : ContentPage, IPage
{
public MainPage()
{
InitializeComponent();
Counter.Clicked += OnCounterClicked;
}
...
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
}
Примечание.
Этот подход можно использовать с целью привязки к нескольким методам обработки по отношению к одному и тому же событию. Каждый метод обработки событий выполняется при возникновении события, хотя не следует предполагать, что они будут выполняться в любом определенном порядке, поэтому не вводите между ними зависимости.
Аналогичным образом можно удалить обработчик событий, отменив подписку из события оператором -=
позже в приложении:
Counter.Clicked -= OnCounterClicked;