Я немного смущен. Я знаю, что я могу создать класс, полученный из EventArgs, чтобы иметь пользовательские данные о событиях. Но можно ли каким-то образом использовать базовый класс EventArgs? Как и при нажатии кнопки мыши, в методе подписчика всегда присутствует параметр "EventArgs e". Могу ли я каким-то образом создать метод, который будет передавать данные таким образом, я имею в виду, что они будут переданы в базе Eventargs?
Можно передавать данные в EventArgs без создания производного класса?
Ответ 1
Возможно ли использовать только тип данных 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);
Ответ 2
Вы можете использовать класс 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.
Ответ 3
Неа. Базовый класс EventArgs - это всего лишь способ разрешить некоторые стандартные типы делегатов событий. В конечном счете, чтобы передать данные обработчику, вам потребуется подкласс EventArgs. Вместо этого вы можете использовать аргумент отправителя, но это должен быть объект, который запустил событие.