有很多方法可以给这只猫剥皮。下面举两个例子。
第一种方法
没有任何外部库的简单方法是在子窗口上创建自定义并从父窗口订阅。您也可以通过这种方式传播对象。
要传播的对象:
public class MyCommunicationObject
{
public string Message { get; set; }
}
然后是子窗口:
public partial class ChildWindow : Window
{
public event Action<MyCommunicationObject> MyChildWindowEvent;
public ChildWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var myObject = new MyCommunicationObject();
myObject.Message = "Hello from Child Window";
this.MyChildWindowEvent(myObject);
}
}
单击按钮将传播 MyChildWindowEvent 事件。
在主窗口中,您必须在创建子对话框时订阅事件(在我的示例中,我在按钮单击时执行此操作,因为那是创建窗口的时间)。
主窗口代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
var childWindow = new ChildWindow();
childWindow.MyChildWindowEvent += ChildWindow_MyChildWindowEvent;
childWindow.ShowDialog();
}
第二种方法
或者按照上面的建议使用EventAggregator。您可以使用例如棱镜。您必须使用 NuGet 管理器安装它。安装后,它允许您使用EventAggregator 对象。该对象可以传播从PubSubEvent 继承的事件,例如:
public class MyEvent : PubSubEvent<MyCommunicationObject>
{
}
主窗口和子窗口必须共享EventAggregator 的一个实例。然后,您必须订阅由您的子窗口传播的事件。假设已经在主窗口中创建了对象,下面是一个如何订阅和处理主窗口上的事件的示例(再次单击按钮):
private void Button_Click_2(object sender, RoutedEventArgs e)
{
var childWindow = new AnotherChildWindow(eventAggregator);
eventAggregator.GetEvent<MyEvent>().Subscribe(obj =>
{
this.myTextBox2.Text = obj.Message;
});
childWindow.ShowDialog();
}
并且子窗口必须发布事件(连同用于通信的对象):
private void Button_Click(object sender, RoutedEventArgs e)
{
var myObject = new MyCommunicationObject();
myObject.Message = "Hello from another child window";
this.eventAggregator.GetEvent<MyEvent>().Publish(myObject);
}
在子窗口中EventAggregator 的实例来自主窗口。