gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:40:17 30 4
gpt4 key购买 nike

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

我在尝试:

第一个。 使用 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 的角度来看,这并不好。

如何解决这个问题?

最佳答案

在 MVVM 样式中完成此操作的一种方法是使用 MVVM Light Messenger 类从 View 模型发送播放/暂停消息, View 将订阅和接收这些消息。

假设您的 View 上有一对按钮用于播放和暂停。你会放弃 EventToCommand behavior在 Expression Blend 中的每一个上,然后将它们绑定(bind)到 View 模型中的一对 RelayCommand 属性,一个用于播放的 RelayCommand,一个用于暂停。例如,在您的 View 模型中,您将拥有:

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

Play 命令将让 Messenger 发送一条 Play 消息,而 Pause 命令将发送一条 Pause 消息。每条消息都是它自己的简单类:
public class PlayMessage { }
public class PauseMessage { }

然后,在 View 模型的构造函数中,您将为之前创建的两个 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() );
}

您的 View 将是 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 是您在 View 的 xaml 中为 MediaElement 指定的名称。

关于mvvm-light - 在 Windows Phone MVVM 应用程序中播放/暂停 mp3 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8661329/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com