【问题标题】:Bind MediaStreamSource to MediaElement将 MediaStreamSource 绑定到 MediaElement
【发布时间】:2012-01-10 10:10:45
【问题描述】:

我有一个动态生成的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);
}

【问题讨论】:

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


    【解决方案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 视图中

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

    【讨论】:

      【解决方案2】:

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

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

      在 MVVM Light 中,你会这样做:

      发布(来自 ViewModel):

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

      订阅(在您的视图中)

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

      【讨论】:

      • 我目前正在使用 MVVM light,所以这非常有帮助!
      • 使用较新版本的 MVVM light,您不再需要从 MessageBase 派生。任何东西都可以通过信使发送。
      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2011-01-25
      相关资源
      最近更新 更多