我有这段代码:
MediaElement player = new MediaElement();
Windows.Storage.StorageFolder folder;
Windows.Storage.StorageFile file;
string FileName = "";
private async void Play(string Tno, string Cno)
{
folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets");
for (int i = 1; i <= 4; i++)
{
switch (i)
{
case 1:
FileName = "Sound\\mysound1.wav";
break;
case 2:
FileName = "Sound\\mysound2.wav";
break;
case 3:
FileName = "Sound\\mysound3.wav";
break;
case 4:
FileName = "Sound\\mysound4.wav";
break;
}
file = await folder.GetFileAsync(FileName);
player.SetSource(await file.OpenAsync(Windows.Storage.FileAccessMode.Read), file.ContentType);
player.Play();
}
}
播放声音&#34; mysound4.wav&#34;。 当我跟踪代码时,它会快速播放4个文件,没有任何延迟。 那么如何在第一个文件完成后才能播放第二个文件?
答案 0 :(得分:2)
在WPF应用程序中,解决方案可以是使用像这样的队列......
public partial class MainWindow : Window
{
private readonly Queue<string> _audioFilesQueue = new Queue<string>();
private readonly MediaElement _player;
public MainWindow()
{
InitializeComponent();
_player = new MediaElement();
_player.LoadedBehavior = MediaState.Manual;
_player.UnloadedBehavior = MediaState.Manual;
_player.MediaEnded += Player_MediaEnded;
}
private void Player_MediaEnded(object sender, RoutedEventArgs e)
{
OnProcessQueue();
}
private void Btn_OnClick(object sender, RoutedEventArgs e)
{
PlayCascade(new[]
{
"X:\\Library\\Sounds\\Other\\sound1.wav",
"X:\\Library\\Sounds\\Other\\sound2.wav",
"X:\\Library\\Sounds\\Other\\sound3.wav"
});
}
private void PlayCascade(string[] sequence)
{
foreach (var file in sequence)
{
_audioFilesQueue.Enqueue(file);
}
OnProcessQueue();
}
private void OnProcessQueue()
{
Dispatcher.Invoke(() =>
{
if (_audioFilesQueue.Any())
{
var toPlay = _audioFilesQueue.Dequeue();
_player.Source = new Uri(toPlay);
_player.Play();
}
});
}