我已经阅读了很多关于播放声音/动画的最佳方式的博客,但如果可能的话,我想看一个简单的例子,说明如何做到这一点让我理解得更好。
所以我对MVVM的了解
视图 - >声音和动画
ViewModel - >如果某个值为true,我想在视图上播放声音和动画。
现在我该如何做到这一点。我被告知要使用像ISoundService和IAnimationService这样的接口。在View中实现然后做什么?如果可能的话,一个可行的裸骨示例将有很多帮助。
答案 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,它可以在视图和控制器之间建立更紧密的关系。