Как воспроизводить звук и анимацию в MVVM

Я прочитал много блогов о том, как лучше всего воспроизводить звук/анимацию, но, если возможно, я хотел бы увидеть упрощенный пример того, как это делается, чтобы лучше понять.

Итак, насколько я понимаю, в MVVM

Вид -> Звук и анимация

ViewModel -> Если какое-то значение истинно, я хотел бы воспроизвести звук и анимацию в представлении.

Теперь, как я могу это сделать. Мне сказали использовать такие интерфейсы, как ISoundService и IAnimationService. Реализовать в представлении, а затем сделать что? Если возможно, очень поможет работающий пример голой кости.


person Mike Diaz    schedule 02.06.2010    source источник


Ответы (2)


Что касается звука, это не обязательно представление, которое его обрабатывает. Например, я делаю что-то подобное для воспроизведения звука:

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

Затем я использую Dependency Injection, чтобы передать его в мою ViewModel:

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

Другим вариантом было бы иметь звуковую службу, которая прослушивает события, которые ViewModel отправляет через какую-то систему обмена сообщениями... например, EventAggregator.

Что касается анимации, могут работать те же подходы. Обычно я определяю анимацию в представлении в XAML. Затем в представлении я прослушиваю какое-то событие, которое будет запущено из ViewModel, чтобы указать представлению выполнить эту анимацию.

Кроме того, в прошлом я использовал привязку данных к двойным значениям, которые контролируются в ViewModel, поэтому все еще есть некоторое тестируемое поведение, которое управляет анимацией.

Еще один подход, который я использовал, — это гибрид MVVM/MVP, когда ViewModel получает интерфейс IView с методом ExecuteDeletionAnimation. ViewModel вызывает метод, а View реализует метод.

Надеюсь это немного поможет?

person Brian Genisio    schedule 07.06.2010
comment
Я не думаю, что в Silverlight есть SoundPlayer, как был помечен вопрос. - person Ralph Shillington; 11.01.2012

Я бы подумал, что структура будет выглядеть примерно так...

Модель -> Объект, содержащий звук и видео/растровые изображения

Вид -> Визуальный контроль для содержания раскадровки

ViewModel -> Контроллер для обработки событий анимации

Я не слишком углублялся в анимацию WPF, но, судя по тому, что я видел, вам нужно иметь довольно тесную связь между UIElements и контроллером. Чем MVVM отличается тем, что отделяет логический уровень от уровня представления, это может причинить вам немало боли. Вместо использования MVVM вы можете взглянуть на шаблон MVC, который имеет более тесную связь между представлением и контроллером.

person Agies    schedule 03.06.2010