加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 05:26:29 所属栏目:Windows 来源:网络整理
导读:我试图在我的 Windows Phone 7.5 MVVM应用程序中播放小型mp3文件(使用MVVM Light). 我在尝试: 1.要使用SoundEffect: SoundEffectInstance instance;SoundEffect effect = SoundEffect.FromStream(stream);instance = effect.CreateInstance();FrameworkDis
我试图在我的 Windows Phone 7.5 MVVM应用程序中播放小型mp3文件(使用MVVM Light).

我在尝试:

1.要使用SoundEffect:

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

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

第2位.要使用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.

问题:我需要访问ViewModel中的MediaElement控件,这对MVVM视图来说并不好.

如何解决这个问题?

解决方法

在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提供的名称.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读