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