Можно передать данные в EventArgs без создания производного класса? - PullRequest
12 голосов
/ 22 декабря 2009

Я немного смущен. Я знаю, что могу создать класс, полученный из EventArgs, чтобы иметь пользовательские данные о событиях. Но могу ли я использовать базовый класс EventArgs как-нибудь? Как и при нажатии кнопки мыши, в методе подписчика всегда есть параметр «EventArgs e». Можно ли как-то создать метод, который будет передавать данные таким образом, я имею в виду, что они будут передаваться в базовых Eventargs?

Ответы [ 3 ]

15 голосов
/ 13 ноября 2013

Вы можете использовать класс EventArgs с помощью подхода Generic Types. В этом примере я буду использовать класс Rect с типом возвращаемого значения:

public EventHandler<Rect> SizeRectChanged;

Поднятие события:

if(SizeRectChanged != null){
   Rect r = new Rect(0,0,0,0);
   SizeRectChanged(this,r);
}

Прослушивание события:

anyElement.SizeRectChanged += OnSizeRectChanged;

public void OnSizeRectChanged(object sender, Rect e){
    //TODO abything using the Rect class
    e.Left = e.Top = e.Width = e.Height = 50;
}

Итак, вам не нужно создавать новые классы событий или делегаты, просто создайте EventHandler, передавая определенный тип T.

6 голосов
/ 22 декабря 2009

Неа. Базовый класс EventArgs - это просто способ разрешения некоторых стандартных типов делегатов событий. В конечном итоге, чтобы передать данные в обработчик, вам нужно создать подкласс EventArgs. Вместо этого вы можете использовать arg отправителя, но это действительно должен быть объект, который вызвал событие.

3 голосов
/ 22 декабря 2009

Можно ли просто использовать тип данных EventArgs raw? Абсолютно. По данным MSDN:

Этот класс не содержит данных о событиях; он используется событиями, которые не передают информацию о состоянии обработчику событий при возникновении события. Если обработчику событий требуется информация о состоянии, приложение должно извлечь класс из этого класса для хранения данных.

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

    private event TestEventEventHandler TestEvent;
    private delegate void TestEventEventHandler(EventArgs e);

    private void button1_Click(object sender, EventArgs e)
    {
        TestEvent += TestEventHandler;
        if (TestEvent != null)
        {
            TestEvent(new EventArgs());
        }
    }
    private void TestEventHandler(EventArgs e)
    {
        System.Diagnostics.Trace.WriteLine("hi");
    }

Стоит ли когда-нибудь это делать? Не по какой-то причине, я могу подумать, если. Если вы хотите создавать свои собственные клики, вы можете просто создать экземпляр MouseEventArgs самостоятельно:

MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...