Avalonia. Возможно ли маршрутизированное событие для класса в шаблонном типе?

Да, в Avalonia возможно использование маршрутизированных событий для классов в шаблонных типах.

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

Для использования маршрутизированных событий в шаблонных типах в Avalonia, вам нужно выполнить несколько шагов.

1. Определите класс вашего шаблонного типа и объявите в нем маршрутизированное событие. Можно использовать ключевое слово event для объявления события, как обычно делается в C#.

public class MyTemplateClass<T> : TemplatedControl where T : class
{
    public static readonly RoutedEvent<RoutedEventArgs> MyRoutedEvent = RoutedEvent.Register<MyTemplateClass<T>, RoutedEventArgs>("MyRoutedEvent", RoutingStrategies.Bubble);
    
    public event EventHandler<RoutedEventArgs> MyEvent
    {
        add => AddHandler(MyRoutedEvent, value);
        remove => RemoveHandler(MyRoutedEvent, value);
    }
    
    protected virtual void RaiseMyEvent()
    {
        var args = new RoutedEventArgs(MyRoutedEvent);
        RaiseEvent(args);
    }
    
    ...
}

2. В реализации шаблонного класса, создайте метод-обертку, который будет вызываться всякий раз, когда событие должно быть сгенерировано.

protected void RaiseMyEventWrapper()
{
    RaiseMyEvent();
}

3. В шаблоне вашего шаблонного типа определите элемент управления, который будет генерировать событие.

<ControlTemplate>
    <Button Name="myButton" Click="myButton_Click">Click Me</Button>
</ControlTemplate>

4. В коде вашего шаблонного типа, обработайте событие, сгенерированное элементом управления, и вызовите метод-обертку для генерации маршрутизированного события.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    // ... обработка события ...
    
    RaiseMyEventWrapper();
}

5. Используйте шаблонный тип в вашем пользовательском интерфейсе и добавьте обработчик события в коде.

var myControl = new MyTemplateClass<string>();
myControl.MyEvent += MyEventHandler;

...

private void MyEventHandler(object sender, RoutedEventArgs e)
{
    // ... обработка события ...
}

Таким образом, вы можете использовать маршрутизированные события для классов в шаблонных типах в Avalonia, позволяя элементам управления внутри вложенных элементов получать и обрабатывать события.