【问题标题】:Sending object to method in another class on event在事件中将对象发送到另一个类中的方法
【发布时间】:2015-12-25 17:16:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf events


    【解决方案1】:

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

    第一种方法

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

    要传播的对象:

    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 的实例来自主窗口。

    【讨论】:

      【解决方案2】:

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

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

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

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

      如您所见,这两个实现都是 MVVM 库的一部分,this pattern 对您的应用很有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-16
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多