可以通过三种基本方法来编写事件处理程序。不幸的是,该代码的作者通过不恰当地混合它们而犯了很大的错误。他应该使用的是原始的C#版本1方式:
ImageAnimator.Animate(txImage.Image, OnFrameChanged);
这非常简单且易于理解。当然,在这种情况下您应该强烈喜欢这种语法,它使得调用 StopAnimate() 方法变得非常容易。为了回答你的问题,我需要展示另外两种你不应该使用的方法。在 C# 版本 2 中,可以使用匿名委托就地编写事件处理程序的代码:
ImageAnimator.Animate(txImage.Image, delegate {
// Put the OnFrameChanged code here...
});
在 C# 版本 3 中,lambda 表达式可用于就地编写事件处理程序:
ImageAnimator.Animate(txImage.Image, (s, e) => {
// Put the OnFrameChanged code here...
});
这就是你问的。 lambda 表达式的 (s, e) 部分表示传递给事件处理程序的两个参数,s 是sender, e 是 EventArgs 对象。请注意,您实际上并没有useOnFrameChange 代码中的这两个参数因此 lambda 语法是多余的,匿名委托也可以正常工作。尽管许多 C# 程序员已经停止使用它们,而更喜欢在任何地方使用 lambda 表达式语法。这是公平的。即使您不使用参数,您仍然必须编写它们以使编译器相信您的 lambda 是委托的正确替代品。就像您仍然必须使用两个参数编写 OnFrameChanged 才能让编译器满意一样。
理解 lambda 表达式语法可能会有点困难,任何一本关于 C# 语言的不错的介绍性书籍都会比我解释得更好。
最后但并非最不重要的一点是,您会在以下位置找到一些 hackorama 代码这个答案 https://stackoverflow.com/a/17546316/17034向您展示如何在 PictureBox 中暂停动画,而无需使用 ImageAnimator 类。尽管这可能会增加更多问题:)