将MediaStreamSource绑定到MediaElement

时间:2012-01-10 10:10:46

标签: c# .net silverlight windows-phone-7 mvvm

我有一个动态生成的MediaStreamSource,我想绑定到MediaElement。不幸的是Source属性只接受URI,所以我运气不好。

我可以在后面的代码中调用方法SetSource,但我不知道如何在维护MVVM模式的同时执行此操作。

有没有人让我将MediaElement绑定到源?

解决方案(感谢Claus Jorgensen)

我定义了一个类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 个答案:

答案 0 :(得分:1)

  

但我不知道如何在维护MVVM模式的同时做到这一点。

事件聚合。大多数(如果不是全部)MVVM框架都有一个Messenger或Event Aggregator,允许您发布和订阅自定义事件。

在MVVM Light中,您可以这样做:

发布(来自ViewModel):

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

订阅(在您的视图中)

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

答案 1 :(得分:1)

您还可以使用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}">