Что касается звука, это не обязательно тот вид, который его обрабатывает. Например, я делаю что-то вроде этого для воспроизведения звука:
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 реализует метод.
Надеюсь, это немного поможет?