我正在尝试在我的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视图来说并不好。
如何解决这个问题?
答案 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提供的名称。