C# 处理从主窗口中的模式对话框引发的冒泡事件

C# 处理从主窗口中的模式对话框引发的冒泡事件,c#,wpf,events,routed-events,C#,Wpf,Events,Routed Events,我的WPF应用程序中有一个模式对话框,允许用户登录到服务器。该对话框只包含一个用户控件,用于处理所有登录内容(UI、web服务调用,以及在调用返回时引发路由事件) 所有这些都很好地工作,我可以在对话框中处理我的事件(登录成功后关闭对话框)。但是,我无法在主应用程序中处理该事件(用户登录后,我应该刷新UI) 如何在引发此类路由事件的窗口之外拦截此类路由事件(如果可能)?如果不可能,通常的处理方法是什么?路由事件不会从一个窗口转到另一个窗口 在子窗口上定义公共CLR事件。当主窗口实例化子窗口时,它应

我的WPF应用程序中有一个模式对话框,允许用户登录到服务器。该对话框只包含一个用户控件,用于处理所有登录内容(UI、web服务调用,以及在调用返回时引发路由事件)

所有这些都很好地工作,我可以在对话框中处理我的事件(登录成功后关闭对话框)。但是,我无法在主应用程序中处理该事件(用户登录后,我应该刷新UI)


如何在引发此类路由事件的窗口之外拦截此类路由事件(如果可能)?如果不可能,通常的处理方法是什么?

路由事件不会从一个窗口转到另一个窗口


在子窗口上定义公共CLR事件。当主窗口实例化子窗口时,它应该在显示子窗口之前为该事件连接一个处理程序。然后,孩子只需要在适当的时间引发此事件。

路由事件不会从一个窗口转到另一个窗口


在子窗口上定义公共CLR事件。当主窗口实例化子窗口时,它应该在显示子窗口之前为该事件连接一个处理程序。然后,孩子只需要在适当的时间引发此事件。

我不知道如何在不同的窗口之间自动冒泡路由事件,因为它们不在同一逻辑树中。复杂UI应用程序处理此类视图间通信的方式是通过
EventAggregator
模式的一些实现,因此,如果您发现需要在视图之间进行大量通信,那么它可以是一种更干净的方式来处理此类场景。Prism框架包含一个
EventAggregator
实现,但是如果需要,为简单场景手工编写的实现应该不会太困难

我不知道如何在不同的窗口之间自动冒泡路由事件,因为它们不在同一个逻辑树中。复杂UI应用程序处理此类视图间通信的方式是通过
EventAggregator
模式的一些实现,因此,如果您发现需要在视图之间进行大量通信,那么它可以是一种更干净的方式来处理此类场景。Prism框架包含一个
EventAggregator
实现,但是如果需要,为简单场景手工编写的实现应该不会太困难

将事件从新窗口路由到所有者。RoutedCommands也不能直接工作。但是
Binding
s可以工作

设置
childWindow.OwnerWindow=Application.Current.MainWindow
时,childWindow通过其
OwnerWindow
属性与主窗口进行逻辑连接

您可以使用它绑定到
OwnerWindow的ViewModel命令并执行它

  <Window x:Class="...ChildWindow"
          ... >
      <Button Command="{Binding Path=OwnerWindow.DataContext.SaveCommand,
                                RelativeSource={RelativeSource
                                    AncestorType={x:Type Window}}}"
              Content="Execute Owner's Save Command" />
  </Window>

将事件从新窗口路由到所有者。RoutedCommands也不能直接工作。但是
Binding
s可以工作

设置
childWindow.OwnerWindow=Application.Current.MainWindow
时,childWindow通过其
OwnerWindow
属性与主窗口进行逻辑连接

您可以使用它绑定到
OwnerWindow的ViewModel命令并执行它

  <Window x:Class="...ChildWindow"
          ... >
      <Button Command="{Binding Path=OwnerWindow.DataContext.SaveCommand,
                                RelativeSource={RelativeSource
                                    AncestorType={x:Type Window}}}"
              Content="Execute Owner's Save Command" />
  </Window>