2

この構文は別の記事 ( C# アニメーション gif の継続的なループを停止する方法) から見つけましたが、理解できないようです。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
}

または、誰でもこれを簡単に説明できます。愚かで申し訳ありませんが、私はプログラミングに本当に慣れていませんが、本当に学びたいですありがとう

4

2 に答える 2

1

イベント ハンドラーを作成する基本的な方法は 3 つあります。残念ながら、そのコードの作成者は、それらを不適切に混同して、かなり間違っていました。彼が使用すべきだったのは、元の C# バージョン 1 の方法です。

ImageAnimator.Animate(txImage.Image, OnFrameChanged);

これは非常に簡単で理解しやすいものです。確かに、この場合に強く推奨する構文であり、StopAnimate() メソッドを非常に簡単に呼び出すことができます。あなたの質問に答えるには、他の 2 つの方法、つまり使用してはいけない方法を示す必要があります。C# バージョン 2 では、匿名デリゲートを使用して、イベント ハンドラーのコードをインプレースで記述できます。

ImageAnimator.Animate(txImage.Image, delegate {
    // Put the OnFrameChanged code here...
});

C# バージョン 3 では、ラムダ式を使用してイベント ハンドラーをインプレースで記述できるようになりました。

ImageAnimator.Animate(txImage.Image, (s, e) => {
    // Put the OnFrameChanged code here...
});

それはあなたが尋ねたものです。ラムダ式の (s, e) 部分は、イベント ハンドラーに渡される 2 つの引数を表します。s は送信者、e は EventArgs オブジェクトです。実際にはOnFrameChange コードでこれら 2 つの引数を使用しないため、ラムダ構文は不要であり、匿名デリゲートも同様に機能することに注意してください。ただし、多くの C# プログラマーはラムダ式の使用をやめ、あらゆる場所でラムダ式の構文を使用することを好みます。これは公平です。引数を使用しない場合でも、引数を記述して、ラムダがデリゲートの適切な代替であることをコンパイラに納得させる必要があります。コンパイラを満足させるために、2 つの引数を指定して OnFrameChanged を記述する必要があったのと同じように。

ラムダ式の構文を理解することは、少しスピード バンプになる可能性があります。C# 言語に関するまともな入門書は、私が説明するよりもうまく機能します。

最後になりましたが、この回答には、ImageAnimator クラスをまったく使用せずに PictureBox でアニメーションを一時停止する方法を示すhackorama コードがいくつかあります。これにより、さらに質問が追加される可能性がありますが:)

于 2013-07-14T11:26:54.003 に答える
0

Animate と StopAnimate は、「アニメーション フレームが変更されたときに呼び出されるメソッドを指定する eventHandler オブジェクト」を想定しています。これは次のように読むことができます。

System.Drawing.ImageAnimator.Animate(txImage.Image, new EventHandler(this.OnFrameChanged))
于 2013-07-14T04:07:25.553 に答える