【问题标题】:System.Drawing.ImageAnimator.Animate and System.Drawing.ImageAnimator.StopAnimate explanationSystem.Drawing.ImageAnimator.Animate 和 System.Drawing.ImageAnimator.StopAnimate 解释
【发布时间】:2013-07-14 02:55:51
【问题描述】:

我从另一篇文章 (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
}

或者任何人都可以简单地解释一下。很抱歉我很愚蠢,但我对编程真的很陌生,但我真的很想学习谢谢

【问题讨论】:

  • 这就是所谓的 lambda 表达式。在这里,它是不必要的。
  • 你应该搜索术语Lambda Expression in .NETse是对应delegate封装的方法的参数,它们可以任意命名,例如@ 987654327@ 代替sev 代替e,...=> 之后的所有东西都是方法的代码部分。
  • 如果你熟悉c#2.0中的Anonymous Method,你会很容易理解Lambda Expression。如果您不了解这两个主题,您可以在 MSDN 中同时参考它们
  • tnx 的信息我真的很感激 :)

标签: c# winforms visual-studio-2010 lambda


【解决方案1】:

您可以通过三种基本方式编写事件处理程序。不幸的是,该代码的作者通过不恰当地混合它们而弄错了。他应该用的是原来的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 对象。请注意,您实际上并没有在 OnFrameChange 代码中使用这两个参数,因此 lambda 语法是多余的,匿名委托也可以正常工作。尽管许多 C# 程序员已经停止使用它们,而是更喜欢在任何地方使用 lambda 表达式语法。这是公平的。即使您不使用参数,您仍然必须编写它们以使编译器相信您的 l​​ambda 是委托的适当替代品。就像您仍然必须使用两个参数编写 OnFrameChanged 才能让编译器满意。

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

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

【讨论】:

  • 哇,非常感谢 Hans Passant 先生,我真的明白了,谢谢!
  • 汉斯先生,现在我了解.Animatelambada expressions 如何在特定帧停止 Gif,比如它有 7 个帧。如果我的鼠标进入picture box,它会用 gif 更改其图像并将其停在第 7 帧。
  • 只计算 OnFrameChanged 方法中的帧数,当您到达 7 时不要更改帧数。
  • 所以意思是我使用getFrameCount,你能指定一个简单的语法吗
  • 您需要点击按钮才能提出其他问题。
【解决方案2】:

Animate 和 StopAnimate 期望“一个 eventHandler 对象,该对象指定动画帧更改时调用的方法。” 你可以这样理解

System.Drawing.ImageAnimator.Animate(txImage.Image, new EventHandler(this.OnFrameChanged))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多