2010-06-02 41 views
3

我已經閱讀了許多有關播放聲音/動畫的最佳方式的博客,但如果可能的話,我希望看到一個關於如何完成這個操作的簡化示例,以便我更好地理解。如何在MVVM播放聲音和動畫

因此我在MVVM

觀的理解 - >聲音和動畫

視圖模型 - >如果某個值是真的,我想打視圖上的聲音和動畫。

現在我該如何去做這件事。我被告知使用ISoundService和IAnimationService等接口。在視圖中實現,然後做什麼?如果可能的話,一個可行的裸骨例子將有助於很多。

回答

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(); 
    } 
} 

然後,我使用依賴注入將它傳遞到我的視圖模型:

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

另一種選擇是有一個完善的售後服務坐在那裏,偵聽ViewModel通過一些消息系統發送的事件... EventAggregator,例如。

就動畫而言,相同類型的方法可以工作。通常,我在XAML中的視圖中定義動畫。然後,在視圖中,我偵聽從ViewModel觸發的某種事件,以通知View執行該動畫。

另外,在過去,我使用了數據綁定來增加在ViewModel中控制的值,所以仍然有一些可測試的行爲來管理動畫。

我使用的另一種方法是混合MVVM/MVP事物,ViewModel通過一個名爲ExecuteDeletionAnimation的方法傳遞一個IView接口。 ViewModel調用該方法,View實現該方法。

希望這會有所幫助嗎?

+0

我不認爲在Silverlight中有一個SoundPlayer,問題是如何標記的。 – 2012-01-11 16:46:41

1

我認爲結構會看起來像......

型號 - >包含聲音和視頻/位圖

視圖對象 - >包含故事板

視覺控制

視圖模型 - >處理動畫事件的控制器

我還沒有深入研究WPF動畫,但從我所見到的你需要在UIElements和Controller之間有非常密切的關係。 MVVM擅長的是將邏輯層與表示層分離,這可能會導致相當大的痛苦。而不是使用MVVM,你可能想看看View和Controller之間有更緊密關係的MVC模式。