Содержание
Наши компоненты Razor так или иначе базируются на стандартных HTML-элементах — кнопках, полях ввода, переключателях и т.д. И нам необходимо уметь обрабатывать события этих элементов в наших компонентах.
Пример обработчика события
Самый первый пример обработчика события мы видим в компоненте Counter шаблонного приложения Blazor Hybrid
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
Здесь для кнопки добавлен обработчик события click с использованием атрибута директивы @onclick. Различные HTML-элементы могут предоставлять нам различные события, поэтому, как мы уже знаем, в Razor для обработки событий используется один синтаксис атрибутов директив:
@on[EVENT]=[Delegate]
где EVENT — название события, а Delegate — делегат, соответствующий событию.
Аргументы событий
Обработчики событий могут принимать различные аргументы. Например, обработчик @onclick может принимать аргумент, представленный классом Mouse. Этот класс предоставляет нам следующие свойства:
Alt |
Определяет была ли нажата клавиша ALT |
Button |
Номер кнопки, нажатой при срабатывании события мыши:
|
Buttons |
Кнопки, нажатые при срабатывании события мыши:
При нажатии двух или более кнопок возвращает логическую сумму значений. |
ClientX |
Координата X указателя мыши в локальных координатах |
ClientY |
Координата Y указателя мыши в локальных координатах |
Ctrl |
Определяет была ли нажата клавиша Ctrl |
Detail |
Количество последовательных щелчков, которые произошли за короткий промежуток времени, с увеличением на единицу. |
Meta |
если возвращает true, то нажата метаклавиша |
MovementX |
Координата X указателя мыши относительно позиции последнего события mousemove. |
MovementY |
Координата Y указателя мыши относительно позиции последнего события mousemove. |
OffsetX |
Координата X указателя мыши в относительных координатах (целевого элемента). |
OffsetY |
Координата Y указателя мыши в относительных координатах (целевого элемента). |
PageX |
Координата X указателя мыши относительно всего документа. |
PageY |
Координата Y указателя мыши относительно всего документа. |
ScreenX |
Координата X указателя мыши в глобальных координатах (экран). |
ScreenY |
Координата Y указателя мыши в глобальных координатах (экран). |
Shift |
Определяет была ли нажата клавиша Shift |
Type |
Возвращает или задает тип события. |
Например, создадим новое приложение Blazor Hybrid и перепишем компонент Counter следующим образом:
@page "/counter"
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount(MouseEventArgs args)
{
if (args.CtrlKey == false)
{
currentCount++;
}
else
{
currentCount--;
}
}
}
здесь мы использовали аргумент события в обработчике и проверили была ли зажата клавиша Ctrl при клике и в зависимости от этого либо наращиваем счётчик на 1, либо наоборот — уменьшаем. При этом, в разметке компонента ничего не изменилось:
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
Можно запустить приложение и убедиться, что при зажатой клавише Ctrl значение счётчика уменьшается на 1:
Blazor предоставляет нам различные встроенные аргументы событий, которые содержатся в пространстве имен Microsoft..
| Событие | Класс | События в модели DOM |
|---|---|---|
| Буфер обмена | ClipboardEventArgs |
oncut, oncopy, onpaste |
| Перетаскивание | DragEventArgs |
ondrag, ondragstart, ondragenter, ondragleave, ondragover, ondrop, ondragend |
| Error | ErrorEventArgs |
onerror |
| Событие | EventArgs |
Общие сведенияonactivate, onbeforeactivate, onbeforedeactivate, ondeactivate, onfullscreenchange, onfullscreenerror,
Ввод
|
| Фокус | FocusEventArgs |
onfocus, onblur, onfocusin, onfocusout
Не включает поддержку |
| Входные данные | ChangeEventArgs |
onchange, oninput |
| Клавиатура | KeyboardEventArgs |
onkeydown, onkeypress, onkeyup |
| Мышь | MouseEventArgs |
onclick, oncontextmenu, ondblclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout |
| Указатель мыши | PointerEventArgs |
onpointerdown, onpointerup, onpointercancel, onpointermove, onpointerover, onpointerout, onpointerenter, onpointerleave, ongotpointercapture,
|
| Колесико мыши | WheelEventArgs |
onwheel, onmousewheel |
| Ход выполнения | ProgressEventArgs |
onabort, onload, onloadend, onloadstart, onprogress, ontimeout |
| Сенсорные технологии | TouchEventArgs |
ontouchstart, ontouchend, ontouchmove, ontouchenter, ontouchleave, ontouchcancelTouchPoint представляет одну точку касания на устройстве с сенсорным вводом. |
Асинхронная обработка событий
Blazor поддерживает асинхронную обработку событий. Асинхронная обработка событий может быть полезна, например, в случае, если в обработчике события идёт обращение к сетевым ресурсам, работа с базой данных и так далее. Например, перепишем код обработки события в компоненте Counter, добавив асинхронную обработку:
@page "/counter"
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private async Task IncrementCount(MouseEventArgs args)
{
await Task.Delay(1000);
if (args.CtrlKey == false)
{
currentCount++;
}
else
{
currentCount--;
}
}
}
Здесь метод IncrementCount() асинхронный. Можно запустить приложение и убедиться, что счётчик изменяет свое значение через секунду после клика по кнопке.
Использование лямбда-выражений
Для обработки событий необязательно создавать отдельный метод — мы можем также использовать лямбда-выражения. Например так:
@page "/counter"
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="@((args)=>
{
if (args.CtrlKey)
currentCount--;
else
currentCount++;
})">Click me</button>
@code {
private int currentCount = 0;
}
здесь args — это объект класса MouseEventArgs. Можно запустить приложение и убедиться, что оно работает точно также, как и раньше.
Используя лямбда-выражения, мы также можем передавать в обработчики событий произвольные аргументы. Например, так:
@page "/counter"
<h1>Counter</h1>
<p role="status">Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="(e=>Click(e, 10))">Click me</button>
@code {
private int currentCount = 0;
private void Click(MouseEventArgs args, int data)
{
if (args.CtrlKey)
currentCount -= data;
else
currentCount += data;
}
}
Запустите приложение и убедитесь, что теперь счётчик наращивается сразу на 10:
Итого
Обработка событий в html-элементах осуществляется с использованием директив атрибутов @on[Event]. В обработчиках событий могут использоваться аргументы событий. Blazor содержит ряд предопределенных аргументов событий. Также, для определения обработчика события не обязательно использовать отдельные методы — мы можем использовать для этих целей лямбда-выражения.

