3

そのため、SąrašasList というリスト クラスがあり、曲へのパス名を含む vardas という文字列項目があります。このリストにはいくつかの曲があり、AX Windows Media プレーヤーの GUI もありますが、次のように記述します。

private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
{
    foreach (SąrašasList d in atrinktas)
    {
        axWindowsMediaPlayer1.URL = d.getVardas();
    }
}

最後の曲しか再生されず、次の曲に移動しません。どうすればよいですか? このプレーヤーで、すべての曲を次々と再生してもらいたいです。

4

1 に答える 1

5

基本的には、すべての曲を反復処理し、各曲をプレーヤーにロードします。もちろん、プレーヤーはそのうちの1 つしか処理できないため、コレクションの最後の 1 つが効果的に再生されます。

最初の曲をロードし、各メディアの最後に n + 1 曲をロードする必要があります。

private System.Timers.Timer Timer; // Used to introduce a delay after the MediaEnded event is raised, otherwise player won't chain up the songs

private void ScheduleSongs() {
    var count = 0;
    var firstSong = atrinktas.FirstOrDefault(); // using Linq
    if(firstSong == null) return;
    axWindowsMediaPlayer1.URL = firstSong.getVardas();
    // PlayStateChange event let you listen your player's state. 
    // https://msdn.microsoft.com/fr-fr/library/windows/desktop/dd562460(v=vs.85).aspx
    axWindowsMediaPlayer1.PlayStateChange += delegate(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e) { 
       if(e.newState == 8 && count < atrinktas.Count()) {
          count++;
          var nextSong = atrinktas[count];
          axWindowsMediaPlayer1.URL = nextSong.getVardas();
          Timer = new System.Timers.Timer() { Interval = 100 };
          Timer.Elapsed += TimerElapsed; // Execute TimerElapsed once 100ms is elapsed          
       } 
    };
}

private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    Timer.Stop();
    Timer.Elapsed -= TimerElapsed;
    Timer = null;

    axWindowsMediaPlayer1.Ctlcontrols.play(); // Play the next song
}
于 2016-01-09T11:29:05.703 に答える