有什么方法可以从 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);
我正在尝试创建一个 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);