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
语句。