簡體   English   中英

如何讓媒體元素自動播放下一個列表框項目?

[英]How can you let the media-element automatically play the next list-box item?

我正在制作一個媒體播放器,在其中將媒體文件添加到列表框中。 我想做的是使媒體元素在當前播放結束后自動開始播放列表框中的下一首歌曲/視頻。 我也想做一個doubleclick事件,如果單擊listitem,則應該播放歌曲/視頻。 這是我目前擁有的:

XAML:

<MediaElement Name="objMediaPlayer" LoadedBehavior="Manual" UnloadedBehavior="Stop" MediaOpened="objMediaPlayer_MediaOpened" MediaEnded="objMediaPlayer_MediaEnded" Margin="20,19,20,40" ButtonBase.Click="mediaItemList_MouseDoubleClick" />

<ListBox Canvas.Left="882" Canvas.Top="12" Height="467" Name="mediaItemList" Width="260" Background="Gray" MouseDoubleClick="mediaItemList_MouseDoubleClick" />

CS-片:

 private void BrowseButtonClick(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
        dlg.Multiselect = true;
        dlg.InitialDirectory = "c:\\";
        dlg.Filter = "All Files (*.*)|*.*";
        dlg.RestoreDirectory = true;

        if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            foreach (string file in dlg.FileNames)
            {
                FileInfo fileName = new FileInfo(file);
                mediaItemList.Items.Add(fileName);
            }
            string selectedFileName = dlg.FileName;
            fileNameLabel.Content = selectedFileName;
            objMediaPlayer.Source = new Uri(selectedFileName);
            objMediaPlayer.Play();
            lblCoverUp.Visibility = Visibility.Hidden;


        }
    }
private int currentSongIndex = -1;
    private void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {

            if (currentSongIndex == -1)
            {
                currentSongIndex = mediaItemList.SelectedIndex;
            }
            currentSongIndex++;
            if (currentSongIndex < mediaItemList.Items.Count)
            {

                objMediaPlayer.Play();
            }
            else
            {
                // last song in listbox has been played
            }           
    }



    private void mediaItemList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }

對於Doubleclick功能

    private void mediaItemList_MouseDoubleClick(object sender, RoutedEventArgs e)
    {
        System.Windows.Controls.Button prevButton = objMediaPlayer.Tag as System.Windows.Controls.Button;
        System.Windows.Controls.Button button = (sender as System.Windows.Controls.Button);
        FileInfo fileInfo = button.DataContext as FileInfo;

        // If a file is playing, stop it

        if (prevButton != null)
        {
            objMediaPlayer.Tag = null;
            objMediaPlayer.Stop();
            prevButton.Background = Brushes.LightYellow;
           // if the one thats playing is the one that was clicked -> don't play it
            if (prevButton == button)
                return;
        }
        // Play the one that was clicked
        objMediaPlayer.Tag = button;
        objMediaPlayer.Source = new Uri(fileInfo.FullName);
        objMediaPlayer.Play();
    }

對於Media_ended,我已經嘗試過:objMediaPlayer.Play(mediaItemList.Items [currentSongIndex]);

激活Doubleclick事件時,出現以下錯誤:對象引用未設置為對象的實例。 (FileInfo fileInfo = button.DataContext作為FileInfo)。

我希望有一個人可以幫助我。 如果您需要更多信息,只需詢問

編輯:我已經通過使用以下代碼修復了大多數媒體結束問題:

    private void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {
        objMediaPlayer.Stop();

        if (mediaItemList.SelectedIndex <= mediaItemList.Items.Count)
        {
            mediaItemList.SelectedIndex = mediaItemList.SelectedIndex += 1;
            fileNameLabel.Content = mediaItemList.SelectedItem;
            objMediaPlayer.Play();
        }
        else
        {
            objMediaPlayer.Stop();
            fileNameLabel.Content = " ";
        }
    }

現在唯一的問題是,播放完最后一首歌曲(listitem)后播放器不會停止播放。 您如何解決此問題。

確定要播放每個文件嗎?:

private void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
{
    if (currentSongIndex == -1)
    {
        currentSongIndex = mediaItemList.SelectedIndex;
    }
    currentSongIndex++;
    if (currentSongIndex < mediaItemList.Items.Count)
    {
        objMediaPlayer.Open(new Uri(mediaItemList.ElementAt(currentSongIndex), 
            UriKind.Absolute));            
    }
    else
    {
        // last song in listbox has been played
    }           
}

private void MediaPlayer_MediaOpened(object sender, EventArgs e)
{
    objMediaPlayer.Play();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM