gpt4 book ai didi

c# - System.Drawing.ImageAnimator.Animate 和 System.Drawing.ImageAnimator.StopAnimate 解释

转载 作者:太空宇宙 更新时间:2023-11-03 13:39:25 26 4
gpt4 key购买 nike

我从另一篇文章 ( C# How to stop animated gif from continually looping ) 中找到了这个语法,但我似乎无法理解它。

中 s 和 e 的含义或目的是什么
System.Drawing.ImageAnimator.Animate(txImage.Image, (s,e) => OnFrameChanged(s,e));


// start
System.Drawing.ImageAnimator.Animate(txImage.Image, (s,e) => OnFrameChanged(s,e));

// stop
System.Drawing.ImageAnimator.StopAnimate(txImage.Image, (s, e) => OnFrameChanged(s, e));

private void OnFrameChanged(object sender, EventArgs e)
{
// frame change
}

或者任何人都可以简单地解释一下。对不起,我很愚蠢,但我真的是编程新手,但我真的很想学习谢谢

最佳答案

您可以通过三种基本方式编写事件处理程序。不幸的是,该代码的作者通过不恰本地将它们混合在一起而弄错了。他应该用的是原来的C#版本1方式:

ImageAnimator.Animate(txImage.Image, OnFrameChanged);

这非常简单易懂。当然,在这种情况下您应该非常喜欢这种语法,它使调用 StopAnimate() 方法变得非常容易。为了回答你的问题,我需要展示其他两种你不应该使用的方法。在 C# 版本 2 中,匿名委托(delegate)可用于就地编写事件处理程序的代码:

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 对象。请注意,您实际上并未在 OnFrameChange 代码中使用这两个参数,因此 lambda 语法是多余的,匿名委托(delegate)也同样有效。尽管许多 C# 程序员已经停止使用它们并更喜欢在任何地方使用 lambda 表达式语法。这是公平的。即使您不使用参数,您仍然必须编写它们以说服编译器您的 lambda 是委托(delegate)的适当替代品。就像您仍然必须使用两个参数编写 OnFrameChanged 以使编译器满意一样。

理解 lambda 表达式语法可能有点像减速带,任何一本关于 C# 语言的不错的介绍性书籍都会比我解释得更好。

最后但同样重要的是,您会在 this answer 中找到一些 hackorama 代码向您展示如何在根本不使用 ImageAnimator 类的情况下暂停 PictureBox 中的动画。尽管有可能这只会增加更多问题 :)

关于c# - System.Drawing.ImageAnimator.Animate 和 System.Drawing.ImageAnimator.StopAnimate 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17636121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com