我有一个动态生成的MediaStreamSource,我想绑定到MediaElement。不幸的是,Source属性只接受URI,所以我运气不好。
我可以在后面的代码中调用一个方法SetSource,但是我不知道如何在维护MVVM模式的同时做到这一点。
有人有方法让我将MediaElement绑定到源吗?
解决方案(感谢Claus )
我定义了一个类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);
}发布于 2015-12-15 19:23:36
还可以使用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}">发布于 2012-01-10 10:40:51
,但是我不知道如何在维护MVVM模式的同时做到这一点。
事件聚合。大多数(如果不是全部) MVVM框架都有一个Messenger或事件聚合器,允许您发布和订阅自定义事件。
在MVVM Light中,您可以这样做:
发布(来自ViewModel):
Messenger.Default.Send(new MediaStreamSource(...));订阅(在您的视图中)
Messenger.Default.Register<MediaStreamSource>(this, source => { element.SetSource(source); })https://stackoverflow.com/questions/8801537
复制相似问题