如何在MVVM中播放声音和动画

时间:2010-06-02 01:48:41

标签: silverlight mvvm mvvm-light

我已经阅读了很多关于播放声音/动画的最佳方式的博客,但如果可能的话,我想看一个简单的例子,说明如何做到这一点让我理解得更好。

所以我对MVVM的了解

视图 - >声音和动画

ViewModel - >如果某个值为true,我想在视图上播放声音和动画。

现在我该如何做到这一点。我被告知要使用像ISoundService和IAnimationService这样的接口。在View中实现然后做什么?如果可能的话,一个可行的裸骨示例将有很多帮助。

2 个答案:

答案 0 :(得分:8)

就声音而言,这不一定是处理它的视图。例如,我这样做是为了播放声音:

public interface IAudioPlayer
{
    void Play(string fileName);
}

public class AudioPlayer : IAudioPlayer
{
    private readonly SoundPlayer player = new SoundPlayer();

    public void Play(string fileName)
    {
        player.Stream = File.OpenRead(fileName);
        player.Play();
    }
}

然后,我使用依赖注入将其传递给我的ViewModel:

public class TheViewModel
{
    public TheViewModel(IAudioPlayer audioPlayer)
    {
         // probably store it as a private readonly field for later use.
    }
}

另一种选择是让一个健全的服务坐在那里,听取ViewModel通过某个消息传递系统发送的事件......例如EventAggregator。

就动画而言,相同类型的方法可以起作用。通常,我在XAML中的View中定义动画。然后,在View中,我会侦听从ViewModel触发的某种事件,以告诉View执行该动画。

此外,在过去,我使用数据绑定来加倍在ViewModel中控制的值,因此仍然存在一些可测试的行为来管理动画。

,我已经采用的是一种混合MVVM / MVP的东西,其中所述视图模型被传递的IVIEW接口与方法在其上称为ExecuteDeletionAnimation一种其他的方法。 ViewModel调用该方法,View实现该方法。

希望这有点帮助?​​

答案 1 :(得分:1)

我认为结构看起来像......

模型 - >包含声音和视频/位图的对象

查看 - >用于包含故事板的可视化控件

ViewModel - >用于处理动画事件的控制器

我没有深入研究WPF动画,但是从我看到的你需要在UIElements和Controller之间建立非常密切的关系。 MVVM擅长的是逻辑层与表示层的分离,这可能会给你带来相当大的痛苦。您可能希望查看MVC模式,而不是使用MVVM,它可以在视图和控制器之间建立更紧密的关系。