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

时间:2011-10-19 17:23:22

标签: c# wpf events routed-events

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

一切正常,我可以在对话框中处理我的事件(登录成功时关闭对话框)。但是,我无法在主应用程序中处理事件(我应该在用户登录后刷新UI)。

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

3 个答案:

答案 0 :(得分:2)

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

设置childWindow.OwnerWindow = Application.Current.MainWindow时,childWindow通过其OwnerWindow属性逻辑连接到MainWindow。

您可以使用它绑定到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>

答案 1 :(得分:1)

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

在子窗口中定义公共CLR事件。当主窗口实例化子进程时,它应该在显示子进程之前挂钩该事件的处理程序。然后孩子只需要在适当的时候举起这个活动。

答案 2 :(得分:1)

我不知道如何在不同窗口之间自动冒泡路由事件,因为它们不在同一个逻辑树中。复杂的UI应用程序倾向于处理这种类型的视图间通信的方式是通过EventAggregator模式的一些实现,所以如果你发现在视图之间需要大量的通信,那么它可以更清晰的方式处理这种情况。 Prism框架包含一个EventAggregator实现,但如果需要,一个简单方案的手写框架应该不会太难。