Передача события и обработчика события делегата в универсальный вспомогательный метод - PullRequest
3 голосов
/ 05 ноября 2011

У меня есть это по всему моему коду. Это приложение WP7 Silverlight.

UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += 
                                new RoutedEventHandler(this.ButtonClickHandler));

Итак, приведенный выше код в потоке пользовательского интерфейса, присваивающем событие buttonControl.Click обработчику событий ButtonClickHandler .. например:

public void ButtonClickHandler(object sender, System.Windows.RoutedEventArgs e)
{

}

То, что я хотел бы, это рефакторинг:

UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click += 
                                new RoutedEventHandler(this.ButtonClickHandler));

в единый статический, но универсальный вспомогательный метод, способный указывать любое событие управления пользовательским интерфейсом и обработчик события. Затем метод соединит их вместе, используя класс UIThreadExecutor.

Конечно, buttonControl также может быть любым элементом управления пользовательским интерфейсом - с разными событиями одного типа. Например, это может быть RadioButton с событием Checked.

Если я перейду к определению в VS 2010 для RadioButton.Checked или Button.Click, они оба будут одного типа:

public event RoutedEventHandler Checked;

Я почесал голову об этом. Я подумал, внутри моего статического помощника - объявление делегата (объявленного на уровне пространства имен):

public delegate void UIControlHandler(object sender, RoutedEventArgs e);

Тогда мой вспомогательный метод выглядит так:

public static void SubscribeToUIEvent(EventHandler eventToSubscribeTo, 
                                                        UIControlHandler handler)
{
    UIThreadExecutor.UIThreadExec.Execute(() => eventToSubscribeTo += handler);
}

Это приводит к ошибкам компиляции:

Оператор '+ =' нельзя применить к операндам типа 'System.EventHandler' и UIControlHandler
Не удается неявно преобразовать тип UIControlHandler 'в' System.EventHandler '

Может кто-нибудь помочь направить меня в правильном направлении? Это сводит меня с ума.

1 Ответ

2 голосов
/ 05 ноября 2011

Ключевое слово: MulticastDelegate

Вот общий обзор событий / делегатов в C #.http://www.codeproject.com/KB/cs/delegates_overview.aspx

Конечно, вы также можете использовать интерфейсы с объявлениями событий.

Редактировать 2:

Я нашел это: Как передать событие в метод? Это должно помочь, я не думаю, что вы получите лучшее решение, потому что невозможно передать ref-параметры в метод anonymus.

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