我的 WPF 应用程序中有一个模式对话框,允许用户登录到服务器。该对话框仅包含一个处理所有登录内容(UI、Web 服务调用以及在调用返回时引发路由事件)的用户控件。
一切正常,我可以在对话框中处理我的事件(登录成功时关闭对话框)。但是,我无法在我的主应用程序中处理该事件(一旦用户登录,我应该刷新 UI)。
如何在引发事件的窗口之外拦截此类路由事件(如果可能的话)?如果不可能,通常的处理方法是什么?
我的 WPF 应用程序中有一个模式对话框,允许用户登录到服务器。该对话框仅包含一个处理所有登录内容(UI、Web 服务调用以及在调用返回时引发路由事件)的用户控件。
一切正常,我可以在对话框中处理我的事件(登录成功时关闭对话框)。但是,我无法在我的主应用程序中处理该事件(一旦用户登录,我应该刷新 UI)。
如何在引发事件的窗口之外拦截此类路由事件(如果可能的话)?如果不可能,通常的处理方法是什么?
路由事件不会从新窗口发送给所有者。RoutedCommands 也不会直接工作。但是Binding
s可以工作!
当您设置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>
我看不出您如何在不同窗口之间自动冒泡路由事件,因为它们不在同一个逻辑树中。复杂的 UI 应用程序倾向于处理这种类型的视图间通信的方式是通过EventAggregator
模式的一些实现,所以如果你发现你需要在视图之间进行大量的通信,那么它可以是一种更简洁的方式来处理这些类型的场景。Prism 框架包含一个EventAggregator
实现,但如果需要,一个简单场景的手写一个应该不会太难。
路由事件不会从一个窗口传递到另一个窗口。
在您的子窗口上定义一个公共 CLR 事件。当主窗口实例化孩子时,它应该在显示孩子之前为该事件连接一个处理程序。然后孩子只需要在适当的时间提出这个事件。