在事件

时间:2015-12-25 17:16:06

标签: c# wpf events

在我的第二个窗口中,双击我想在我的MainWindow中调用一个方法并向它发送一个对象。

当第二个窗口由MainWindow拥有时,一切正常,但是这导致MainWindow总是被绘制在第二个窗口后面,这不是我想要的。

所以我的问题是,在我的第二个窗口中按钮点击后,如何在我的MainWindow中调用我的public LoadSong(Song tempSong)方法(假设我无法直接调用该方法)?

2 个答案:

答案 0 :(得分:0)

您可以使用EventAggregator或其他event-based patterns

首先使用对象类型的属性创建新事件,以便在组件之间发送它。

接下来将MainWindow订阅到您的事件,并使用从handler参数接收的参数在事件处理程序中调用LoadSong。

最后在双击事件处理程序的第二个窗口中引发(或以其他方式发布)您的事件。

正如您所看到的,两个实现都是MVVM库的一部分,this pattern对您的应用程序非常有用。

答案 1 :(得分:0)

有很多方法可以给这只猫上皮。以下两个例子。

第一种方法

没有任何外部库的简单方法是在子窗口上创建自定义并从父级订阅它。你也可以用这种方式传播一个对象。

要传播的对象:

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。你可以使用例如Prism。您必须使用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的实例来自主窗口。