Передача дополнительных аргументов из EventHandler в void в C#

#c# #.net

#c# #.net

Вопрос:

Это мой код:

 private async void Page_Loaded(object sender, RoutedEventArgs e)
{
   i = .../
   uc[i].PreviewMouseDown  = new MouseButtonEventHandler(UCClick(sender, e, i));
}



private void UCClick(object sender, RoutedEventArgs e, int i)
{
    MessageBox.Show(i);
}
 

i является переменной в Page_Loaded void. Я просто хочу использовать его в UCClick void, но я получаю следующую ошибку:

Ожидаемое имя метода!

Я новичок в C # и я этого не понимаю. Кто-нибудь может помочь?

Комментарии:

1. попробуйте присвоить это значение control . Помечайте и считывайте его при возникновении события

Ответ №1:

Самый простой способ — использовать лямбда-выражение:

 uc[i].PreviewMouseDown  = (sender, e) => UCClick(sender, e, i);
 

Вы можете добавить, new MouseButtonEventHandler если хотите, но это бессмысленно, так как компилятор вставит это за вас.

Смотрите Документы по анонимным функциям.

Нет необходимости добавлять, например new MouseButtonEventHandler , при подписке на события — компилятор вставит его для вас автоматически. Например, эти две строки выполняют одно и то же:

 something.PreviewMouseDown  = SomeHandler;
something.PreviewMouseDown  = new MouseButtonEventHandler(SomeHandler);
 

Комментарии:

1. Не могли бы вы полностью объяснить? Я новичок в этом и не знаю, что вы имеете в виду, добавляя этот код » в » новый MouseButtonEventHandler !

2. @Emad SomeHandler должен соответствовать шаблону, ожидаемому от a MouseButtonEventHandler . Обычно, если вы позволите Visual Studio сгенерировать его, вы получите шаблон, в котором увидите, что использовать. Но вы не можете просто добавить к этому дополнительные вещи. Я советую просто сохранить ваше значение for i в глобальной переменной в классе, чтобы UCLICK мог получить к нему прямой доступ, не нуждаясь в нем как аргументе функции.