簡體   English   中英

如何在ProjectB中的dll中從ProjectA訂閱C#GUI事件

[英]How to subscribe to C# GUI event from ProjectA in dll in ProjectB

我在ProjectA中有一個C#WPF GUI。 我在ProjectA中引發一個事件,並希望從ProjectB內訂閱/響應該事件,該項目是一個對ProjectA一無所知的dll。 ProjectA引用了ProjectB中的對象,反之亦然。

例如,用戶單擊ProjectA中的按鈕。 在ProjectA的button_Click()處理程序內部,它調用UserClickedButtonX(this,e)。 ProjectB應該訂閱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!");
        }

您應該能夠將此行放入ProjectA中(例如MainWindow構造器):

MainWindow.UserClickedButtonXEvent += ProjectB.ClassB.UserClickedButtonXFunction;

函數必須是公共靜態的,或者必須創建ClassB的實例。 單身人士。

考慮使用EventAggregator在發布/訂閱事件方面使類彼此分離。

這種模式利用發布者和訂閱者可以在彼此不了解的情況下利用的消息(即字符串)。

[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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM