2012-01-10 2 views
1

У меня есть MediaStreamSource, который генерируется динамически, и я хочу привязываться к MediaElement. К сожалению, свойство Source допускает только URI, поэтому мне не повезло.Bind MediaStreamSource to MediaElement

Существует способ SetSource, который я могу вызвать в коде позади, но я не знаю, как это сделать, сохраняя шаблон MVVM.

У кого-нибудь есть способ привязать MediaElement к источнику?

Решение (Спасибо Клаус Йоргенсен)

я определить класс MainPageLoaded для использования в качестве класса сообщений.

public class MainPageLoaded 
{ 
    public MediaStreamSource StreamSource 
    { 
     get; 
     set; 
    } 
} 

я затем отправить свое сообщение на мой взгляд, модель

var msg = new MainPageLoaded(){ StreamSource = new MediaStreamSource()}; 
Messenger.Default.Send<MainPageLoaded>(msg); 

и получить его на мой взгляд

Messenger.Default.Register<MainPageLoaded>(this, (action) => SetSoundSource(action)); 

перед обработкой его

private void SetSoundSource(MainPageLoaded action) 
{ 
    SoundElement.SetSource(action.StreamSource); 
} 

ответ

1

Вы также можете использовать CommandParameter пройти MediaElement на ViewModel и установить источник мультимедиа в поле зрения:

public MyViewModel() 
    { 
     PlayPreviewCommand= new DelegateCommand(PlayPreview, CanPlayPreview); 
    } 

    public ICommand PlayPreviewCommand 
    { 
     get; 
     set; 
    } 

    public void PlayPreview(object par) 
    { 
     if (par != null && par is MediaElement) 
     { 
      var preview = composition.GeneratePreviewMediaStreamSource(640, 480); 
      (par as MediaElement).SetMediaStreamSource(preview); 
      (par as MediaElement).Play(); 
     } 
    } 

и Xaml Просмотр

<MediaElement x:Name="mediaElement" /> 
     <AppBarButton Icon="Play" 
         Label="Play" 
         Command="{Binding PlayPreviewCommand}" 
         CommandParameter="{Binding ElementName=mediaElement}"> 
1

но я не знаю, как это сделать, сохраняя шаблон MVVM.

Совокупность событий. Большинство, если не все, структуры MVVM имеют агрегатор сообщений или событий, позволяющий публиковать и подписываться на пользовательские события.

В MVVM Light, вы могли бы сделать:

Публикация (с ViewModel):

Messenger.Default.Send(new MediaStreamSource(...)); 

Подписка (на ваш взгляд)

Messenger.Default.Register<MediaStreamSource>(this, source => { element.SetSource(source); }) 
+0

Я в настоящее время использую MVVM свет, так что это очень полезно! –

+0

С новой версией MVVM light вам больше не нужно выводить из MessageBase. Все может быть отправлено через мессенджер. –

+1

О, блестящий блестящий. –