Перейти к основному содержимому

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