2010-12-17 44 views
6

我有一個winform winform1和2用戶控制這種形式在C#編寫一個全球性的自定義事件

現在我要定義一個自定義事件,這是上調控制1控制2 /在control1中被解僱並在control2中被接收。事件應該是global,並且不直接在control1中定義。 control2不應該知道control1的存在。 該事件也應該由其他控件提出。 C#代碼如何?我需要類似發佈者類的東西嗎?

回答

8

您所描述的內容看起來像Mediator pattern,其中對象通過消息進行通信。這些消息可以實現爲事件,回調或任何其他機制。

你可以使用像MVVM LightMessenger類的實現(該框架旨在與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

8

您可以使用一個靜態事件:

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()); 
+4

如果你這樣做的話,要小心內存泄漏......如果你不取消訂閱,該事件將對其處理程序保持強烈的引用,並且將阻止它們被收集 – 2010-12-17 23:55:36

+0

該事件如何強有力地引用其處理程序這個案例?你能詳細說明嗎? – AllSolutions 2013-03-08 20:44:35

+0

@AllSolutions,因爲按定義事件持有對處理程序的引用。只是靜態事件根本不會超出範圍,因爲它們是靜態的,而實例事件在收集時會隨着包含對象一起超出範圍。 – 2013-03-08 21:15:19

2

因此,您可以製作您的表單發佈者(以及控件之間的中介),並且您的所有控件都將成爲將根據事件通知的訂閱者。

在控件中發生事件,表單將被通知,表單上的事件處理程序將通知訂閱此事件的其他控件。