2011-11-05 70 views
3

我在整个代码中都有这些。这是一款WP7 Silverlight应用程序。将事件和委托事件处理程序传递到泛型Helper方法

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的2010 VS它们都是同一类型:

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); 
} 

与编译错误出现:

Operator '+=' cannot be applied to operands of type 'System.EventHandler' and UIControlHandler
Cannot implicitly convert type UIControlHandler' to 'System.EventHandler'

任何人都可以帮助指向正确的方向吗?这真让我抓狂。

+2

完全摆脱这个UIThreadExecutor,订阅事件可以在工作线程上完成。尽管这样做非常不寻常,很难理解为什么你需要这个。 –

+0

这不太对 - 将ButtonControl.Click事件分配给事件处理程序ButtonClickHandler,事件处理程序分配给事件不是相反的 – sll

回答

2

关键字:MulticastDelegate

以下是有关在C#中的事件/委托的概述。 http://www.codeproject.com/KB/cs/delegates_overview.aspx

当然,您也可以使用带事件删除的接口。

编辑2:

我发现这一点:How to pass an event to a method? 这应该帮助,我不认为你会得到一个更好的解决方案,因为它是不可能的裁判PARAMS传递给anonymus方法。

+0

谢谢你的回复和链接。我想我明白MulticastDelegate。你可以在哪里分配多个方法到一个委托。当您调用单个委托时,每个方法都会被执行。但我不知道如何使用它作为参数 - 一个对象的事件和一个事件处理程序方法的泛型方法。然后我必须使用该UIThreadExecutor类 - 将它们挂接在一起。 UIThreadExecutor类提供给我,我必须使用它。如果你能指出我正确的方向,那将是非常感谢的人。非常感谢。 –

+0

我更新了我的帖子。 –

+0

Hi @Felix K.感谢您的回复。不幸的是,我得到一个编译错误:无法在匿名方法,lambda表达式或查询表达式中使用ref或out参数'eventToSubscribeTo'。 –

相关问题