簡體   English   中英

C# 使用事件處理程序創建事件列表,以向事件列表添加或刪除處理程序

[英]C# Create a list of events with an event handler to add or remove the handler to the event list

在一個應用程序中,我有一個相當大的事件列表及其分配的處理程序,例如:

...
Resize += FormMain_Resize;
ResizeEnd += FormMain_ResizeEnd;
...

我想要做的是將所有這些項目添加到列表中,以便我可以遍歷它們以取消分配(關閉它們),做一堆工作,然后再次遍歷列表以將事件處理程序重新分配給事件。

迄今為止,我還沒有找到任何有關創建實際列表及其分配的事件處理程序的相關信息。 這是我不應該嘗試的事情嗎?

我創建了一個 class 如下:

public class EventWHandler
{
    public EventWHandler(EventHandler e, EventHandler m)
    {
        EventItem = e;
        Method = m;
    }

    public EventHandler EventItem { get; private set; }
    public EventHandler Method { get; private set; }

    public void Listen()
    {
        EventItem += Method;
    }

    public void UnListen()
    {
        EventItem -= Method;
    }
}

有了創建上述 class 列表的想法:

list.Add(new EventWHandler(Resize, FormMain_Resize));

但是,如果不進行一些調整,這將無法工作——因為我無法對事件進行 object 引用(並使用 EventHandler 進行演示)

有沒有更好的方法來遍歷指定的事件列表及其處理程序?

(注意:我不想遍歷所有事件,也不想遍歷所有事件的處理程序 - 只是一個指定的列表。)

(注意:使用 .net 4.7 - 項目約束)

我想你可能想要System.Collections.ObjectModel.ObservableCollection<EventHandler>System.Delegate

當修改、添加、刪除或替換列表時,您應該使用ObservableCollection<T> class 來更新屬性。

我認為它會起作用。

using System.Collections.ObjectModel;
using System.Collections.Specialized;

public class EventWHandler : ObservableCollection<EventHandler>
{
    public EventHandler CombinedItem { get; private set; }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {;
        if (e.NewItems != null)
            CombinedItem = (EventHandler)Delegate.Combine(e.NewItems.Cast<EventHandler>().ToArray());
        base.OnCollectionChanged(e)
    }
}

在使用中,您不需要先取消分配再分配。 添加 EventHandler 將立即更改 CombinedItem;

EventWHandler ewh = new EventWHandler()
{
    Resize,
    FormMain_Resize
};
ewh.Add(Native_Resize);
ewh.Remove(Native_Resize);

this.Resize += ewh.CombinedItem;

另外,請閱讀這些參考資料:
委托方法
可觀察集合
NotifyCollectionChangedEventArgs

暫無
暫無

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

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