Используя MVVM, у меня есть окно с 3-мя моделями представлений.2, представляющими данные, и один аудиоплеер ViewModel.Взаимодействие пользовательского интерфейса с двумя из них должно вызвать команду «Стоп» аудиоустройства, т. Е.
PlaybackDevice.Stop();
Поскольку у меня есть одна и та же кнопка для «воспроизведения» и «остановки», событиями воспроизведения / остановки можно управлять с помощью одного и того жеКоманда с этой же кнопки.Но не с любой другой кнопки.Я попытался создать экземпляр класса Player и вызвать метод Stop, содержащий PlaybackDevice.Stop ();Не сработало, поэтому я создал статическое устройство PlaybackDevice и вызвал его напрямую из ViewModels - все еще не работает.Как я должен этого достичь?
Player ViewModel:
#region Commands
public ICommand PlayStopTrack { get; set; }
// public ICommand
#endregion
#region Classes
HardwareManager hm = new HardwareManager();
public Mp3FileReader TrackMp3 { get; set; }
public WaveFileReader TrackWav { get; set; }
#endregion
#region Properties
private static string trackToPlay;
public static string TrackToPlay
{
get { return trackToPlay; }
set
{
trackToPlay = value;
}
}
//public string TrackToPLay { get; set; }
public string DidTrackStop{get;set;}
public static WasapiOut PlaybackDevice { get; set; }
public PlayerVM()
{
PlayStopTrack = new RelayCommand(PlayPressed, CanExecute);
}
private bool CanExecute(object obj)
{
return true;
}
//take the default audio device
void GetDevice()
{
Console.WriteLine("Prepare Device");
if (PlaybackDevice == null)
{
PlaybackDevice = hm.InitialiseAudioPlaybackDevice();
}
}
public void PlayTrackFromBeginning(string trackFullPath)
{
if (trackFullPath != null )
{
string fileExtension = Path.GetExtension(trackFullPath);
switch (fileExtension)
{
case ".mp3":
try
{
Console.WriteLine("Init Playing");
TrackMp3 = new Mp3FileReader(trackFullPath);
if (PlaybackDevice == null)
{
GetDevice();
PlaybackDevice.PlaybackStopped += OnPlaybackStopped;
}
if (PlaybackDevice.PlaybackState == PlaybackState.Stopped)
{
PlaybackDevice.Init(TrackMp3);
PlaybackDevice.Play();
GetTrackLength();
}
//}
//catch (Exception e)
//{
// MessageBox.Show(e.Message + " 1- " + e.InnerException);
//}
break;
case ".wav":
//try
//{
Console.WriteLine("Init Playing");
GetDevice();
PlaybackDevice.PlaybackStopped += OnPlaybackStopped;
//TODO implement wav reader.
TrackWav = new WaveFileReader(trackFullPath);
PlaybackDevice.Init(TrackWav);
PlaybackDevice.Play();
GetTrackLength();
//}
//catch (Exception e)
//{
// MessageBox.Show(e.Message + " - " + e.InnerException);
//}
break;
}
ButtonLabel = "Stop";
}
//the actual stop method
private void OnPlaybackStopped(object sender, StoppedEventArgs e)
{
if (TrackMp3 != null)
{
Console.WriteLine("Init StopEvent");
TrackMp3.Dispose();
PlaybackDevice.Dispose();
TrackMp3 = null;
Position = 0;
CurrentTime = "00:00";
isPlaying = false;
}
if (TrackWav != null)
{
TrackWav.Dispose();
PlaybackDevice.Dispose();
TrackWav = null;
Position = 0;
CurrentTime = "00:00";
isPlaying = false;
}
ButtonLabel = "Play";
}
public void PlayPressed(object o)
{
if (Path.GetExtension(TrackToPlay) == ".mp3")
{
if (isPlaying == false
&& TrackMp3 == null
&& TrackToPlay != null)
{
PlayTrackFromBeginning(TrackToPlay);
// IsTrackPlaying = true;
isPlaying = true;
Timer.Start();
}
else if (PlaybackDevice.PlaybackState==PlaybackState.Playing)
{
MessageBox.Show("Stopping ama kur!");
PlaybackDevice.Stop();
isPlaying = false;
//Thread.Sleep(1000);
// PlayTrackFromBeginning(TrackToPLay);
}
}
if (Path.GetExtension(TrackToPlay) == ".wav")
{
if (isPlaying == false
&& TrackWav == null
&& TrackToPlay != null)
{
PlayTrackFromBeginning(TrackToPlay);
// IsTrackPlaying = true;
isPlaying = true;
Timer.Start();
}
else if (isPlaying == true)
{
PlaybackDevice.Stop();
isPlaying = false;
//Thread.Sleep(1000);
// PlayTrackFromBeginning(TrackToPLay);
}
}
}