Написание глобального пользовательского события в C # - PullRequest
6 голосов
/ 18 декабря 2010

У меня есть winform winform1 и 2 пользовательских элемента управления control1 и control2 в этой форме

Теперь я хочу определить пользовательское событие , которое вызывается / запускается в control1 и принимается в control2.Событие должно быть global и не должно определяться напрямую в control1.control2 не должен знать о существовании control1.Событие также должно быть вызвано другими элементами управления.Как C # код для этого?Мне нужно что-то вроде класса издателя?

Ответы [ 3 ]

8 голосов
/ 18 декабря 2010

Вы можете использовать статическое событие:

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());
8 голосов
/ 18 декабря 2010

То, что вы описываете, выглядит как шаблон Mediator , в котором объекты обмениваются сообщениями.Эти сообщения могут быть реализованы как события, обратные вызовы или любой другой механизм.

Вы можете использовать реализацию типа 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 классе

2 голосов
/ 18 декабря 2010

Таким образом, вы можете сделать свою форму издателем (и посредником между элементами управления), и все ваши элементы управления будут подписчиками, которые будут уведомлены о событии.

Если в элементе управления произошло событие, форма будет уведомленаи обработчик события в форме уведомит другие элементы управления, которые подписались на это событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...