C# WPF MediaPlayer:如何按顺序播放,同步?

C# WPF MediaPlayer:如何按顺序播放,同步?,c#,wpf,media-player,C#,Wpf,Media Player,我有这个功能: public static void Play(string FileName, bool Async = false) { System.Windows.Media.MediaPlayer mp = new System.Windows.Media.MediaPlayer(); mp.Open(FileName.ToUri()); mp.Play(); } 当我打电话时 Play(@"file1.mp3");

我有这个功能:

public static void Play(string FileName, bool Async = false)
    {
        System.Windows.Media.MediaPlayer mp = new System.Windows.Media.MediaPlayer();

        mp.Open(FileName.ToUri());
        mp.Play();
    }
当我打电话时

Play(@"file1.mp3");
Play(@"file2.mp3");
Play(@"file3.mp3");
Play(@"file4.mp3");
他们同时玩

如何让MediaPlayer等待文件的结尾,以播放下一个文件?函数应该是什么样的

编辑:


您需要等待当前文件完成播放,然后在下一次调用
Play

这可以通过收听事件来实现

您需要收听以下活动:

mp.MediaEnded += MediaEndedEventHandler;
但是,您还需要将
MediaPlayer
对象设置为静态对象,这样您就只能拥有其中一个。确保只添加此处理程序一次。然后在处理程序中发出一个新事件,开始播放下一个文件


您正在实现的是一个播放列表。因此,您需要将文件添加到播放列表中,然后需要跟踪您在播放列表中的当前位置。

您需要等待当前文件完成播放,然后在下一次调用
Play

这可以通过收听事件来实现

您需要收听以下活动:

mp.MediaEnded += MediaEndedEventHandler;
但是,您还需要将
MediaPlayer
对象设置为静态对象,这样您就只能拥有其中一个。确保只添加此处理程序一次。然后在处理程序中发出一个新事件,开始播放下一个文件


您正在实现的是一个播放列表。因此,您需要将文件添加到播放列表中,然后需要跟踪您在播放列表中的当前位置。

我将与您分享我的解决方案:

我创建了一个窗口:WindowPlay.xaml

<Window x:Class="Sistema.Util.WindowPlay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WindowPlay" 
    AllowsTransparency="True"
    Background="Transparent"
    BorderBrush="Transparent"
    BorderThickness="0"
    ResizeMode="NoResize"
    WindowStyle="None"
    Top="0" Left="0"
    Width="16" Height="16" 
    ShowActivated="False"
    ShowInTaskbar="False"
>
    <Grid>
        <MediaElement Name="MediaElement1" LoadedBehavior="Play" UnloadedBehavior="Close"
                      MediaEnded="MediaElement1_MediaEnded" />
    </Grid>
</Window>

WindowPlay.xaml.cs:

using System;
using System.Windows;

namespace Sistema.Util
{
    /// <summary>
    /// Interaction logic for WindowPlay.xaml
    /// </summary>
    public partial class WindowPlay : Window
    {
        public WindowPlay()
        {
            try
            {
                InitializeComponent();
            }
            catch
            {
                this.Close();
            }
        }

        /// <summary>
        /// Plays the specified file name
        /// </summary>
        /// <param name="FileName">The filename to play</param>
        /// <param name="Async">If True play in background and return immediatelly the control to the calling code. If False, Play and wait until finish to return control to calling code.</param>
        public static void Play(Uri FileName, bool Async = false)
        {
            WindowPlay w = new WindowPlay();

            var mp = w.MediaElement1;

            if (mp == null)
            {
                // pode estar sendo fechada a janela
                return;
            }
            mp.Source = (FileName);

            if (Async)
                w.Show();
            else
                w.ShowDialog();
        }

        private void MediaElement1_MediaEnded(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

    }
}
使用系统;
使用System.Windows;
命名空间Sistema.Util
{
/// 
///WindowPlay.xaml的交互逻辑
/// 
公共部分类WindowPlay:Window
{
公共视窗播放()
{
尝试
{
初始化组件();
}
抓住
{
这个。关闭();
}
}
/// 
///播放指定的文件名
/// 
///要播放的文件名
///如果为True,则在后台播放并立即将控件返回调用代码。如果为False,则播放并等待完成,以将控件返回调用代码。
公共静态无效播放(Uri文件名,bool Async=false)
{
WindowPlay w=新的WindowPlay();
var mp=w.MediaElement1;
if(mp==null)
{
//这是一个很好的选择
返回;
}
mp.Source=(文件名);
如果(异步)
w、 Show();
其他的
w、 ShowDialog();
}
私有void MediaElement1\u MediaEnded(对象发送方,路由目标)
{
这个。关闭();
}
}
}

我将与您分享我的解决方案:

我创建了一个窗口:WindowPlay.xaml

<Window x:Class="Sistema.Util.WindowPlay"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WindowPlay" 
    AllowsTransparency="True"
    Background="Transparent"
    BorderBrush="Transparent"
    BorderThickness="0"
    ResizeMode="NoResize"
    WindowStyle="None"
    Top="0" Left="0"
    Width="16" Height="16" 
    ShowActivated="False"
    ShowInTaskbar="False"
>
    <Grid>
        <MediaElement Name="MediaElement1" LoadedBehavior="Play" UnloadedBehavior="Close"
                      MediaEnded="MediaElement1_MediaEnded" />
    </Grid>
</Window>

WindowPlay.xaml.cs:

using System;
using System.Windows;

namespace Sistema.Util
{
    /// <summary>
    /// Interaction logic for WindowPlay.xaml
    /// </summary>
    public partial class WindowPlay : Window
    {
        public WindowPlay()
        {
            try
            {
                InitializeComponent();
            }
            catch
            {
                this.Close();
            }
        }

        /// <summary>
        /// Plays the specified file name
        /// </summary>
        /// <param name="FileName">The filename to play</param>
        /// <param name="Async">If True play in background and return immediatelly the control to the calling code. If False, Play and wait until finish to return control to calling code.</param>
        public static void Play(Uri FileName, bool Async = false)
        {
            WindowPlay w = new WindowPlay();

            var mp = w.MediaElement1;

            if (mp == null)
            {
                // pode estar sendo fechada a janela
                return;
            }
            mp.Source = (FileName);

            if (Async)
                w.Show();
            else
                w.ShowDialog();
        }

        private void MediaElement1_MediaEnded(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

    }
}
使用系统;
使用System.Windows;
命名空间Sistema.Util
{
/// 
///WindowPlay.xaml的交互逻辑
/// 
公共部分类WindowPlay:Window
{
公共视窗播放()
{
尝试
{
初始化组件();
}
抓住
{
这个。关闭();
}
}
/// 
///播放指定的文件名
/// 
///要播放的文件名
///如果为True,则在后台播放并立即将控件返回调用代码。如果为False,则播放并等待完成,以将控件返回调用代码。
公共静态无效播放(Uri文件名,bool Async=false)
{
WindowPlay w=新的WindowPlay();
var mp=w.MediaElement1;
if(mp==null)
{
//这是一个很好的选择
返回;
}
mp.Source=(文件名);
如果(异步)
w、 Show();
其他的
w、 ShowDialog();
}
私有void MediaElement1\u MediaEnded(对象发送方,路由目标)
{
这个。关闭();
}
}
}

我无法完成此任务,请您编辑我问题中的代码以使其正常工作好吗?@Tony-哦,不,不要使用睡眠。您需要订阅
MediaEnded
事件,然后播放该事件中的下一首曲目。你也可以通过使方法非静态来进一步。我无法使它工作,你能编辑我问题中的代码使其工作吗?@Tony-哦,不,不要使用睡眠。您需要订阅
MediaEnded
事件,然后播放该事件中的下一首曲目。您还可以通过使方法非静态来获得更进一步的结果。您不需要使用
Wait
语句。您不需要使用
Wait
语句。