MediaElement を使ってアニメーションを繰り返す

WPF に用意される MediaElement / MediaPlayer コントロールは、 動画、Gifアニメーション、音声ファイルなどを再生させることができます。 対応するフォーマットは WindowsMediaPlayer で再生できる範囲のものくらいです。

ところが MediaElement はいくつか癖のある挙動をします。そのうちの1つが繰り返し再生です。 そもそも繰り返し再生のためのメソッドは MediaElement に用意されていないため任意に実装する必要があります。 また GIFアニメーションを繰り返し再生する場合には、TimeSpan を 0 に設定してはいけません。

MediaElement によって繰り返し再生する

次のコードのように実装することで、MediaElement に設定したメディアを繰り返し再生することができます。 ここで注意するべき点が1つあります。MediaEndedイベントを利用して繰り返し再生を実現していますが、 GIF アニメーションを繰り返し再生させたいときは、media.Positionプロパティに 0 を設定してはいけません。 0 に設定すると繰り返し再生されません(動画・音声は繰り返される)。

MediaElement media = new MediaElement();
media.LoadedBehavior = MediaState.Manual;
media.MediaEnded += (sender, e) =>
{
	media.Position = TimeSpan.FromMilliseconds(1);
	media.Play();
};

GIF アニメーションのときこのように設定するのは仕様のようです。 動画や音声の繰り返しに関しても 1 ミリ秒の遅延は気にならない場合がほとんどですので、 あらゆるフォーマットに対応する必要があるときは、終了時には 1 ミリ秒から再開するようにするのが良いと思います。

Reference