【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

MediaElementとビジュアルツリー

MediaElementをXAMLに記述しないでコードから呼ぼうとしてハマりました。検索しても情報が錯綜しています。

  1. id:beta_magnus:20090625:1245906963 : SilverlightのMediaElementはビジュアルツリーに組み込まないと音声再生などができないらしい、という噂を聞きつけた。
  2. プログラム主体のSilverlightの勉強 その7 効果音再生 - Tari Lari Run : 実はMediaElementはビジュアルツリーに登録しなくても、オブジェクトの参照を保持してさえいれば、音声は再生されます。しかし、ビジュアルツリーに登録しないと、再生が終わってもMediaEndedイベントが発生しないようです。

結論から言うとビジュアルツリーに登録しなくても再生することは可能でした。
ビジュアルツリーに登録しないでSetSource()後にPlay()しても再生されませんが、何度もしつこくPlay()を呼んでいると再生されることがあります。AutoPlayをtrueにしてSetSource()すると必ず再生されます。推測ですが、SetSource()後に非同期でメディアを解析していて、解析完了前にPlay()を呼び出すと失敗しているように思えます。

そのためコードから再生するときはPlay()を使わずに、AutoPlayをtrueにしてSetSource()すると良いようです。その場合2.で指摘されているようにMediaEndedが発生しないので注意が必要です。