在Windows Phone MVVM应用程序中播放/暂停mp3文件

时间:2011-12-28 21:08:09

标签: mvvm-light windows-phone-7 mediaelement

我正在尝试在我的Windows Phone 7.5 MVVM应用程序中播放小型mp3文件(使用MVVM Light)。

我在尝试:

1st。使用SoundEffect

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

问题:只允许使用.wav文件。

第二。使用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 个答案:

答案 0 :(得分:3)

在MVVM样式中实现此目的的一种方法是使用MVVM Light Messenger类从viewmodel发送播放/暂停消息,视图将订阅和接收该消息。

假设您在播放和暂停视图中有一对按钮。您可以在Expression Blend中删除每个EventToCommand behavior,然后将它们绑定到viewmodel中的一对RelayCommand属性,一个用于Play的RelayCommand,一个用于Pause。例如,在您的viewmodel中,您将拥有:

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

Play命令会让Messenger发送Play消息,Pause命令会发送Pause消息。每条消息都是它自己的简单类:

public class PlayMessage { }
public class PauseMessage { }

然后,在viewmodel的构造函数中,您将为之前创建的两个RelayCommand属性创建新的RelayCommands,这些属性将具有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() );
}

然后,您的视图将have the Messenger subscribe添加到这两种消息类型中,并且会在MediaElement上调用Play和Pause方法:

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是您在视图的xaml中为MediaElement提供的名称。