Привязать MediaStreamSource к MediaElement - PullRequest
1 голос
/ 10 января 2012

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

Существует метод 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);
}

Ответы [ 2 ]

1 голос
/ 15 декабря 2015

Вы также можете использовать CommandParameter для передачи MediaElement в ViewModel и установки источника мультимедиа в 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 View

<MediaElement x:Name="mediaElement" />
        <AppBarButton Icon="Play"
                      Label="Play"
                      Command="{Binding PlayPreviewCommand}"
                      CommandParameter="{Binding ElementName=mediaElement}">
1 голос
/ 10 января 2012

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

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

В MVVM Light вы должны сделать:

Опубликовать (из ViewModel):

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

Подписаться (в вашем представлении)

Messenger.Default.Register<MediaStreamSource>(this, source => { element.SetSource(source); })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...