【发布时间】:2011-11-05 18:46:03
【问题描述】:
我的代码中都有这些。这是一个 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。
如果我在 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'
谁能帮我指出正确的方向?这让我发疯了。
【问题讨论】:
-
完全摆脱这个 UIThreadExecutor ,订阅事件可以在工作线程上完成。虽然这样做非常不寻常,但很难理解为什么需要这样做。
-
这不太对 -
assigning buttonControl.Click event to the event handler ButtonClickHandler,分配给事件的事件处理程序不是相反的