我有一個winform winform1和2用戶控制這種形式在C#編寫一個全球性的自定義事件
現在我要定義一個自定義事件,這是上調控制1和控制2 /在control1中被解僱並在control2中被接收。事件應該是global,並且不直接在control1中定義。 control2不應該知道control1的存在。 該事件也應該由其他控件提出。 C#代碼如何?我需要類似發佈者類的東西嗎?
我有一個winform winform1和2用戶控制這種形式在C#編寫一個全球性的自定義事件
現在我要定義一個自定義事件,這是上調控制1和控制2 /在control1中被解僱並在control2中被接收。事件應該是global,並且不直接在control1中定義。 control2不應該知道control1的存在。 該事件也應該由其他控件提出。 C#代碼如何?我需要類似發佈者類的東西嗎?
您所描述的內容看起來像Mediator pattern,其中對象通過消息進行通信。這些消息可以實現爲事件,回調或任何其他機制。
你可以使用像MVVM Light的Messenger
類的實現(該框架旨在與WPF和Silverlight的使用,但你可以得到的代碼,這個特殊的類,並在WinForms的使用)
// Register for a specific message type
Messenger.Default.Register<TypeOfTheMessage>(this, DoSomething);
...
// Called when someone sends a message of type TypeOfTheMessage
private void DoSomething(TypeOfTheMessage message)
{
// ...
}
// Send a message to all objects registered for this type of message
Messenger.Default.Send(new TypeOfTheMessage(...));
與靜態事件相比,Messenger
類的一大優勢在於它使用弱引用,因此它不會阻止訂閱對象的垃圾回收,從而降低了內存泄漏的風險。
有關Messenger
類的詳細信息,請參閱this link
您可以使用一個靜態事件:
public static class MyGlobalEvent {
public static event EventHandler MyEvent;
public static void FireMyEvent(EventArgs args)
{
var evt = MyEvent;
if (evt != null)
evt(args);
}
}
訂閱以通常的方式:
MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired.");
火,你認爲合適:
MyGlobalEvent.FireMyEvent(new EventArgs());
因此,您可以製作您的表單發佈者(以及控件之間的中介),並且您的所有控件都將成爲將根據事件通知的訂閱者。
在控件中發生事件,表單將被通知,表單上的事件處理程序將通知訂閱此事件的其他控件。
如果你這樣做的話,要小心內存泄漏......如果你不取消訂閱,該事件將對其處理程序保持強烈的引用,並且將阻止它們被收集 – 2010-12-17 23:55:36
該事件如何強有力地引用其處理程序這個案例?你能詳細說明嗎? – AllSolutions 2013-03-08 20:44:35
@AllSolutions,因爲按定義事件持有對處理程序的引用。只是靜態事件根本不會超出範圍,因爲它們是靜態的,而實例事件在收集時會隨着包含對象一起超出範圍。 – 2013-03-08 21:15:19