2010-12-17 9 views
6

Mam WinForm winform1 i 2 użytkownik kontroluje kontroli1 i kontroli2 w tej formiePisanie globalnego zdarzenia niestandardowego w C#

teraz chcę, aby zdefiniować niestandardowe zdarzenie, który jest podniesiony/zwolniony w kontroli1 i otrzymany w kontroli2. Zdarzenie powinno być globalne i nie jest bezpośrednio zdefiniowane w control1. kontrola2 nie powinna wiedzieć o istnieniu kontroli1. Zdarzenie należy również podnieść za pomocą innych elementów sterujących. W jaki sposób jest kod C#? Czy potrzebuję czegoś w rodzaju klasy wydawcy?

Odpowiedz

8

To, co opisujesz, wygląda jak Mediator pattern, w którym obiekty komunikują się za pośrednictwem wiadomości. Komunikaty te można zaimplementować jako zdarzenia, wywołania zwrotne lub dowolny inny mechanizm.

Można użyć realizację podobnego Messenger klasy MVVM Light „s (tych ram jest przeznaczony do użytku z WPF i Silverlight, ale można uzyskać kod dla tej konkretnej klasy i używać go w 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(...)); 

Dużą zaletą klasy Messenger w stosunku do statycznego zdarzenia jest to, że używa słabych odniesień, więc nie zapobiega zbędnemu pobieraniu subskrybowanych obiektów, co zmniejsza ryzyko wycieków pamięci.

Zobacz this link Szczegółowe informacje o klasie Messenger

8

Można używać statycznego zdarzenie:

public static class MyGlobalEvent { 
    public static event EventHandler MyEvent; 

    public static void FireMyEvent(EventArgs args) 
    { 
     var evt = MyEvent; 
     if (evt != null) 
      evt(args); 
    } 
} 

Subskrybuj w zwykły sposób:

MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired."); 

przeciwpożarowe zgodnie z potrzebami:

MyGlobalEvent.FireMyEvent(new EventArgs()); 
+4

Uważaj na wycieki pamięci, jeśli przejdziesz w ten sposób ... wydarzenie będzie zawierało silne odniesienia do jego programów obsługi i uniemożliwi ich zbieranie, jeśli nie anulujesz subskrypcji. –

+0

W jaki sposób wydarzenie zawiera silne odniesienia do jego programów obsługi w ta sprawa? Czy możesz rozwinąć? – AllSolutions

+0

@AllSolutions, ponieważ zdarzenia z definicji zawierają odniesienia do procedur obsługi. Po prostu statyczne zdarzenia nigdy nie wykraczają poza zakres, ponieważ są statyczne, podczas gdy zdarzenia instancji wykraczałyby poza zakres wraz z obiektem, który go zawierał. –

2

Możesz więc wydać formularz wydawcy (i pośrednika między kontrolami), a wszystkie Twoje kontrolki będą subskrybentami, którzy zostaną powiadomieni o zdarzeniu.

Zdarzenie wystąpiło w formancie, formularz zostanie powiadomiony, a moduł obsługi zdarzenia w formularzu powiadomi inne kontrole, które zasubskrybowały to wydarzenie.

Powiązane problemy