我的代码中都有这些内容。这是一款WP7 Silverlight应用程序。
UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click +=
new RoutedEventHandler(this.ButtonClickHandler));
所以,上面的代码,在UI线程上将buttonControl.Click
事件分配给事件处理程序ButtonClickHandler ..例如:
public void ButtonClickHandler(object sender, System.Windows.RoutedEventArgs e)
{
}
我想要的是重构:
UIThreadExecutor.UIThreadExec.Execute(() => buttonControl.Click +=
new RoutedEventHandler(this.ButtonClickHandler));
成一个静态但通用的辅助方法 - 能够指定任何UI控件事件和事件处理程序。然后该方法将使用UIThreadExecutor类将两者连接在一起。
当然,buttonControl也可以是任何UI控件 - 具有相同类型的不同事件。例如 - 它可能是带有Checked事件的RadioButton。
如果我转到了RadioButton.Checked或Button.Click的VS 2010中的定义,它们都属于同一类型:
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'
任何人都可以帮我指出正确的方向吗?这让我发疯了。
答案 0 :(得分:2)
关键字:MulticastDelegate
以下是有关C#中事件/委托的概述。 http://www.codeproject.com/KB/cs/delegates_overview.aspx
当然,您也可以使用具有事件处理功能的接口。
我发现了这个:How to pass an event to a method? 这应该有帮助,我认为你不会得到更好的解决方案,因为不可能将ref params传递给anonymus方法。