Воспроизведение / приостановка mp3-файлов в приложении Windows Phone MVVM - PullRequest
4 голосов
/ 29 декабря 2011

Я пытаюсь воспроизвести небольшой файл mp3 в моем приложении Windows Phone 7.5 MVVM (используется MVVM Light).

Я пытаюсь:

1-й. Комуиспользовать SoundEffect:

SoundEffectInstance instance;
SoundEffect effect = SoundEffect.FromStream(stream);
instance = effect.CreateInstance();
FrameworkDispatcher.Update();
instance.Play();

Проблема: разрешены только файлы .wav.

2nd. Для использования Microsoft.Xna.Framework.Media.Song:

Microsoft.Xna.Framework.Media.Song song = Microsoft.Xna.Framework.Media.Song.FromUri("name", new Uri("someUri"));

Проблема: файл хранится в IsolatedStrorage, и нам нужно знать полный путь к файлу.

Рекомендуемая подсказка:

string path = stream.GetType().GetField("m_FullPath", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(stream).ToString();

не работает.

3d. Для использования стандартного MediaElement.

Проблема: мне нужен доступ к элементу управления MediaElement в ViewModel, который не подходит дляпредставление MVVM.

Как решить эту проблему?

1 Ответ

3 голосов
/ 09 января 2012

Один из способов сделать это в стиле MVVM - использовать класс MVVM Light Messenger для отправки сообщений воспроизведения / паузы от модели представления, на которую представление подписалось бы и получило.

Скажем, у вас есть паракнопок на ваш взгляд для воспроизведения и паузы.Вы бы сбросили поведение EventToCommand для каждого из них в Expression Blend, а затем связали бы их с парой свойств RelayCommand в вашей модели представления, одной RelayCommand для Play, одной для Pause.Например, в вашей модели представления вы должны иметь:

public RelayCommand PlayCommand { get; private set; }
public RelayCommand PauseCommand { get; private set; }

Команда Play будет заставлять Messenger отправлять сообщение Play, а команда Pause будет отправлять сообщение Pause.Каждое сообщение будет иметь свой собственный простой класс:

public class PlayMessage { }
public class PauseMessage { }

Затем в конструкторе вашей модели представления вы создадите новые RelayCommands для двух свойств RelayCommand, которые вы создали ранее, и которые будут иметь действия, которые Messenger отправитсообщения:

MyViewModel()
{
    PlayCommand = new RelayCommand( () => SendPlayMessage() );
    PauseCommand = new RelayCommand( () => SendPauseMessage() );
}

private void SendPlayMessage()
{
    Messenger.Default.Send<PlayMessage>( new PlayMessage() );
}

private void SendPauseMessage()
{
    Messenger.Default.Send<PauseMessage>( new PauseMessage() );
}

В этом случае будет отображать подписку Messenger для обоих типов сообщений и действия, которые вызовут методы Play и Pause для MediaElement:

MyView()
{
    Messenger.Default.Register<PlayMessage>
    (
        this,
        ( action ) => ReceivePlayMessage( action )
    );
    Messenger.Default.Register<PauseMessage>
    (
        this,
        ( action ) => ReceivePauseMessage( action );
    );
}

private void ReceivePlayMessage(PlayMessage msg)
{
    myMediaElement.Play();
}

private void ReceivePauseMessage(PauseMessage msg)
{
    myMediaElement.Pause();
}

Где myMediaElement - это имя, которое вы даете MediaElement в xaml вашего представления.

...