有什么方法可以从 AvaloniaUI 中的 UserControl 将事件冒泡到 MainWindow 吗?

Is there any way to bubble events up to the MainWindow from a UserControl in AvaloniaUI?

我正在尝试创建一个 Avalonia 应用程序,它通过将 MainWindow 中的内容绑定到 MainWindowViewModel 中的 属性 内容来使用多个 UserControl 视图。(我相信这是 MVVM 的标准)。

我希望能够处理用户输入,例如点击屏幕、按下按钮等,同时让这些事件冒泡到主窗口,以便可以监视用户的所有输入。这将允许可以简单地使用的通用处理程序更新不活动计时器。

最远的事件似乎在同一个 UserControl 中,但是我想从 MainWindow 处理事件。这意味着每次创建一个新的 UserControl 时,不活动计时器仍会在没有重大更改的情况下运行。

这是我目前处理 UserControls 上的点击事件的方式:

    public static event EventHandler<RoutedEventArgs> TapRegistered;

    private void InitializeComponent()
    {
        AvaloniaXamlLoader.Load(this);
    }

    private void RegisterTap(object sender, RoutedEventArgs e) => IdleWindowView.TapRegistered?.Invoke(this, e);

然后我只是在 UserControl 的 ViewModel 上选择它。

如果有任何有用的信息,请告诉我 - 我不确定要添加什么代码。

您需要像这样通过 RoutedEvent.Register 实际注册一个 RoutedEvent

public static readonly RoutedEvent<RoutedEventArgs> FooEvent = 
       RoutedEvent.Register<RoutedEventArgs>(
            "Foo",
            RoutingStrategies.Bubble,
            typeof(YourType));

然后调用control.RaiseEvent(new RoutedEventArgs { RoutedEvent = FooEvent });来提高它。

通过在 MainWindow 的 code-behind 中添加一个处理程序,我能够检测到 MainWindow(和所有视图)上的点击,如下所示:

this.AddHandler(TappedEvent, this.RegisterTap, handledEventsToo: true);

只需向 ViewModel 发送一个事件来更新不活动计时器,如下所示:

private void RegisterTap(object sender, RoutedEventArgs e) => MainWindow.TapRegistered?.Invoke(sender, e);