Перейти к основному содержимому
Версия: 11.0.0

Defining Events (рус: Определяющие события)

В Avalonia, события позволяют пользовательским компонентам UI взаимодействовать с пользователем, а также оповещать его о конкретных действиях и инцидентах. Определяя события, вы предоставляете пользователям ваших компонентов возможность реагировать и отвечать на события внутри собственных приложений. В текущем документе будет представлено руководство по определению событий для ваших компонентов.

Routed Event (рус: Перенаправленное событие)

Перенаправленные события предоставляют механизм обработки событий, которые могут перемещаться (или перенаправляться) по дереву компонентов, что позволяет нескольких компонентам реагировать на одно и то же событие.

Перенаправленные события обладают следующими ключевыми функциями:

  • Event Routing (рус: Перенаправление событий): Перенаправляемые события могут распространяться вверх (bubbling (рус: пузырение)) или вниз (tunneling (рус: туннелирование)) по дереву, что позволяет компонентам на разных уровнях обрабатывать одно и тоже событие. Такой подход обеспечивает более гибкую и централизованную обработку событий.

  • Event Handlers (рус: Обработчики событий): Перенаправляемые события используют обработчики событий для реагирования на них. Обработка событий связана с определенными компонентами или может быть добавлена на более высоких уровнях визуального дерева для обработки событий от нескольких компонентов.

  • Handled State (рус: Обрабатываемое состояние): Перенаправляемые события имею свойство Handled, которое можно использовать для пометки события как handled (рус: обработанное), что предотвращает дальнейшее распостранение. Такой способ позволяет осуществлять детальный контроль над обработкой событий.

  • Event Routing Strategies (рус: Стратегия перенаправления событий): Avalonia поддерживает различные стратегии перенаправления для перенаправляемых событий, такие как bubbling (рус: пузырение), tunneling (рус: туннелирование) и прямое перенаправление. Эти стратегии определяют порядок, в котором компоненты получают и обрабатывают события. Перенаправляемые события особенно полезны, когда вам требуется обрабатывать события, возникающие внутри вложенных компонентов или если вы хотите централизованную логику обработки событий выше по визуальному дереву.

Пример

Ниже указан пример, как определить перенаправленное событие для гипотетического пользовательского компонента "ползунок":

public class MyCustomSlider : Control
{
public static readonly RoutedEvent<RoutedEventArgs> ValueChangedEvent =
RoutedEvent.Register<MyCustomSlider, RoutedEventArgs>(nameof(ValueChanged), RoutingStrategies.Direct);

public event EventHandler<RoutedEventArgs> ValueChanged
{
add => AddHandler(ValueChangedEvent, value);
remove => RemoveHandler(ValueChangedEvent, value);
}

protected virtual void OnValueChanged()
{
RoutedEventArgs args = new RoutedEventArgs(ValueChangedEvent);
RaiseEvent(args);
}
}

В данном примере, пользовательское перенаправляемое событие определено под именем ValueChangedEvent для компонента MyCustomSlider. Система RoutedEvent регистрирует событие, что дает возможность пользователям компонента подписаться на него. Для удобства также определено CLR-событие, что позволяет и его использовать способом, совместимым со стандартами .NET API.

Дальнейшее изучение

Подробную информацию смотрите по ссылке Routed Events Deep Dive