为 WinForm 应用程序创建自定义事件时没有重载匹配委托
No overload matches delegate when creating custom event for a WinForm application
我正在学习用 c# 制作 WinForm,我对委托的概念还很陌生。在网上查了一下,这个错误好像是delegate和EventHandler不一致导致的。但它们对我来说似乎很好,至少 EventArgs 定义是相同的。请告诉我哪里出了问题。
我已将它放在 Form1 构造函数中:
ImageRenamed += OnImageRenamed;
以下代码是我想在触发 applyBtn_Click 时引发的自定义事件。
public delegate void ImageRenamedEventHandler(object sender, EventArgs e);
public event ImageRenamedEventHandler ImageRenamed;
protected virtual void OnImageRenamed()
{
if (ImageRenamed != null)
ImageRenamed(this, EventArgs.Empty);
}
private void applyBtn_Click(object sender, EventArgs e)
{
// do something
OnImageRenamed();
}
你快完成了。您的 OnImageRenamed 需要一些参数:
protected virtual void OnImageRenamed(object sender, EventArgs e)
{
if (ImageRenamed != null)
ImageRenamed(this, EventArgs.Empty);
}
如果您正在寻找具有 (object,EventArgs)
签名的方法的附件,则不需要自定义委托,只需使用
public event EventHandler ImageRenamed;
并取消该委托定义
此外,您可以查看更改事件调用
protected virtual void OnImageRenamed(EventArgs e)
{
EventHandler eh = ImageRenamed;
eh?.Invoke(this, e);
}
(并用 EventArgs.Empty 调用)
如果在使用 if
确定是否应调用它和实际调用它之间的一小段 window 时间内删除处理程序,则将其缓存到局部变量中有助于防止潜在问题
如果对重命名的多个不同图像引发相同的事件,请考虑提供一个 EventArgs 以通知接收者哪个图像被重命名。
I've placed this inside the Form1 constructor:
另外值得指出的是,您似乎在这里变得不稳定。 OnImageRenamed 方法调用事件并由发起事件的代码调用。 类 可以通过 OnXxx 方法引发事件(但他们不必这样做)
它不打算成为处理事件的方法。你会做一些更像:
this.ImageRenamed += <press the TAB key twice>
VS 会为您做这样的事情:
this.ImageRenamed = Form_ImageRenamed;
}
private void Form_ImageRenamed(object sender, EventArgs e){
throw new NotImplementedException();
}
当图像被重命名时,您可以将 NIE 替换为您想要 运行 的代码
还值得注意的是,您实际上并不需要表单来处理它自己的事件,因为它知道它正在发生。更典型的做法是在表单上使用按钮实例(自包含 class),并将表单的一种方法附加到其点击事件;因此,处理事件(在您的表单中)的方法在 class 引发它(Microsoft 的按钮)之外。您也许可以拥有另一种形式,该形式具有进行重命名的形式的实例,例如:
renamerForm.ImageRenamed += ...
这样当重命名发生在外部形式时 renamerForm
调用本地形式的方法。 sender
将是 renamerForm
在内部,将 event
视为在引发事件时以任何顺序调用的方法列表(所有方法都具有相同的签名)。您使用 +=
将一些方法附加到列表中,只要它的签名匹配,它就会被接受。以下内容也有效:
ImageRenamed += (s,e) => MessageBos.Show("The image was renamed");
我正在学习用 c# 制作 WinForm,我对委托的概念还很陌生。在网上查了一下,这个错误好像是delegate和EventHandler不一致导致的。但它们对我来说似乎很好,至少 EventArgs 定义是相同的。请告诉我哪里出了问题。
我已将它放在 Form1 构造函数中:
ImageRenamed += OnImageRenamed;
以下代码是我想在触发 applyBtn_Click 时引发的自定义事件。
public delegate void ImageRenamedEventHandler(object sender, EventArgs e);
public event ImageRenamedEventHandler ImageRenamed;
protected virtual void OnImageRenamed()
{
if (ImageRenamed != null)
ImageRenamed(this, EventArgs.Empty);
}
private void applyBtn_Click(object sender, EventArgs e)
{
// do something
OnImageRenamed();
}
你快完成了。您的 OnImageRenamed 需要一些参数:
protected virtual void OnImageRenamed(object sender, EventArgs e)
{
if (ImageRenamed != null)
ImageRenamed(this, EventArgs.Empty);
}
如果您正在寻找具有 (object,EventArgs)
签名的方法的附件,则不需要自定义委托,只需使用
public event EventHandler ImageRenamed;
并取消该委托定义
此外,您可以查看更改事件调用
protected virtual void OnImageRenamed(EventArgs e)
{
EventHandler eh = ImageRenamed;
eh?.Invoke(this, e);
}
(并用 EventArgs.Empty 调用)
如果在使用 if
确定是否应调用它和实际调用它之间的一小段 window 时间内删除处理程序,则将其缓存到局部变量中有助于防止潜在问题
如果对重命名的多个不同图像引发相同的事件,请考虑提供一个 EventArgs 以通知接收者哪个图像被重命名。
I've placed this inside the Form1 constructor:
另外值得指出的是,您似乎在这里变得不稳定。 OnImageRenamed 方法调用事件并由发起事件的代码调用。 类 可以通过 OnXxx 方法引发事件(但他们不必这样做)
它不打算成为处理事件的方法。你会做一些更像:
this.ImageRenamed += <press the TAB key twice>
VS 会为您做这样的事情:
this.ImageRenamed = Form_ImageRenamed;
}
private void Form_ImageRenamed(object sender, EventArgs e){
throw new NotImplementedException();
}
当图像被重命名时,您可以将 NIE 替换为您想要 运行 的代码
还值得注意的是,您实际上并不需要表单来处理它自己的事件,因为它知道它正在发生。更典型的做法是在表单上使用按钮实例(自包含 class),并将表单的一种方法附加到其点击事件;因此,处理事件(在您的表单中)的方法在 class 引发它(Microsoft 的按钮)之外。您也许可以拥有另一种形式,该形式具有进行重命名的形式的实例,例如:
renamerForm.ImageRenamed += ...
这样当重命名发生在外部形式时 renamerForm
调用本地形式的方法。 sender
将是 renamerForm
在内部,将 event
视为在引发事件时以任何顺序调用的方法列表(所有方法都具有相同的签名)。您使用 +=
将一些方法附加到列表中,只要它的签名匹配,它就会被接受。以下内容也有效:
ImageRenamed += (s,e) => MessageBos.Show("The image was renamed");