在C#中无法隐式转换类型'System.EventHandler'为'System.Windows.RoutedEventHandler'

7
在Windows Phone应用程序中,我想动态添加一个按钮,如下所示:
Button btn = new Button();
btn.Content = tb_groupname.Text;
btn.Width = 200;
btn.Height = 200;
btn.Click += new EventHandler(btn_Click);//Click event

但是,当我在我的按钮上添加点击事件时,我遇到了以下错误:
Cannot implicitly convert type 'System.EventHandler' to 'System.Windows.RoutedEventHandler'

以下是按钮的点击事件方法:

private void btn_Click(object sender, EventArgs e)
{
  textbox1.text = "ABC"; // For Example
}

我不明白为什么会出现这个错误。 请给我建议,等待回复。 谢谢。

3个回答

10

您的事件处理程序的签名是错误的。

它应该是:

private void btn_Click(object sender, RoutedEventArgs e)

而且Click事件的赋值应该被修改为:

btn.Click += new RoutedEventHandler(btn_Click);//Click event

它会返回另一个错误:“没有重载 'btn_Click' 与委托 'System.EventHandler' 匹配”。 - user88
1
你也改变了 Click 的赋值吗? - Patrick Hofman
点击分配应该指向RoutedEventHandler - Mr Moose

1

您需要使用RoutedEventHandler(在System.Windows程序集中找到)。

在您的情况下,您应该能够将btn.Click += new EventHandler(btn_Click);更改为btn.Click += new System.Windows.RoutedEventHandler(btn_Click);; 然后将EventArgs ob btn_Click更改为RoutedEventArgs

确保添加对System.Windows程序集的引用,否则它将无法编译!

查看MSDN,我得到了这个:

委托用于不在事件数据中报告特定于事件的信息的任何路由事件。有许多这样的路由事件;突出的例子包括Click和Loaded。

编写路由事件处理程序与编写通用公共语言运行时(CLR)事件处理程序之间最值得注意的区别是,事件的发送方(附加并调用处理程序的元素)不能视为事件的源。源在事件数据中报告为属性(Source)。发送方和源之间的差异是事件在通过元素树的遍历期间被路由到不同元素的结果。

链接到msdn


1
是由Patrick Hofman提到的路由事件。
您甚至可以通过编写btn.Click += btn_Click;来缩短代码,而无需创建新事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接