如何在项目 B 的 dll 中从项目 A 订阅 C# GUI 事件

本文关键字:项目 订阅 GUI 事件 dll | 更新日期: 2023-09-27 18:34:47

我在ProjectA中有一个C# WPF GUI。 我在项目 A 中引发一个事件,并希望从项目 B 中订阅/响应该事件,这是一个对项目 A 一无所知的 dll。 项目 A 在项目 B 中引用对象,反之则不然。

例如,用户单击 Project A 中的按钮。 在ProjectA的button_Click((处理程序中,它调用UserClickedButtonX(this,e(。 Project B 应订阅 UserClickedButtonEvent 并在引发事件时处理它。

下面的代码不起作用,因为ProjectB不知道ProjectA中的"MainWindow"。 提前感谢!

In ProjectA (Mainwindow.xaml.cs):
        private void buttonX_Click(object sender, RoutedEventArgs e) {
            OnUserClickedButtonXEvent(new EventArgs());
        }
        public static event UserClickedButtonXEventHandler UserClickedButtonXEvent;
        public virtual void OnUserClickedButtonXEvent(EventArgs e) {
            if (UserClickedButtonXEvent!= null)
                UserClickedButtonXEvent(this, e);
        }
In Project B (dll):
           MainWindow.UserClickedButtonXEvent+= new UserClickedButtonXEventHandler(UserClickedButtonXFunction);
        void UserClickedButtonXFunction(object source, EventArgs e) {
            Console.WriteLine("User clicked Button X on the GUI in another project!");
        }

如何在项目 B 的 dll 中从项目 A 订阅 C# GUI 事件

你应该能够把这一行放到项目A中(例如。主窗口构造器(:

MainWindow.UserClickedButtonXEvent += ProjectB.ClassB.UserClickedButtonXFunction;

函数必须是公共静态的,或者你必须创建一个 ClassB 的实例,例如单例。

考虑使用事件聚合器在发布''订阅事件方面将类彼此分离。

此模式利用消息(即字符串(,发布者和订阅者可以在不了解彼此的情况下利用这些消息。

[TestMethod]
public void eventaggregator()
{
    // Setup
    var subscription = "my_subscription";
    bool messageReceived = false;
    EventAggregator.Instance.Register(subscription, (parameter) =>
        {
            // Logic goes here...
            messageReceived = true;
        });
    // Test
    EventAggregator.Instance.Publish(subscription, "a parameter for subscibers");
    // Verify
    Assert.IsTrue(messageReceived);
}

public class EventAggregator
{
    #region Singleton
    static EventAggregator _eventAggregator = null;
    private EventAggregator() { }
    public static EventAggregator Instance
    {
        get
        {
            if (_eventAggregator == null)
            {
                _eventAggregator = new EventAggregator();
            }
            return _eventAggregator;
        }
    }
    #endregion
    List<Observer> _observers = new List<Observer>();
    public void Register(string subscription, Action<object> response)
    {
        var observer = new Observer() { Subscription = subscription, Respond = response };
        _observers.Add(observer);
    }
    public void Publish(string subscription, object payload)
    {
        foreach (var observer in _observers)
        {
            if (observer.Subscription == subscription)
            {
                observer.Respond(payload);
            }
        }
    }
}
public class Observer
{
    public string Subscription { get; set; }
    public Action<object> Respond {get; set; }
}