C# 无法在SaveState/LoadState之后设置MediaElement源

C# 无法在SaveState/LoadState之后设置MediaElement源,c#,windows-runtime,winrt-xaml,C#,Windows Runtime,Winrt Xaml,(注意:所有代码都已严重简化。) 问题 挂起/恢复后未设置MediaElement源。设置电源后,当前状态迅速变为“关闭” 我正在处理MediaFailed事件-它不会触发。我也在处理MediaOpen事件,它也不会触发 细节 我使用以下方法更新MediaElement的源代码。只要应用程序在被暂停后不尝试恢复,它就可以正常工作 private async void UpdateMediaElementSource(对象发送方,事件参数e) { var videoSource=this.Defa

注意:所有代码都已严重简化。

问题 挂起/恢复后未设置MediaElement源。设置电源后,当前状态迅速变为“关闭”

我正在处理MediaFailed事件-它不会触发。我也在处理MediaOpen事件,它也不会触发

细节 我使用以下方法更新MediaElement的源代码。只要应用程序在被暂停后不尝试恢复,它就可以正常工作

private async void UpdateMediaElementSource(对象发送方,事件参数e)
{
var videoSource=this.DefaultViewModel.CurrentSource;//一个字符串
var file=await-StorageFile.getfilefrompathsync(视频源);
var videoStream=await file.OpenAsync(FileAccessMode.Read);
this.videoMediaElement.SetSource(videoStream,file.ContentType);
//只要应用程序不尝试恢复,上面这一行就可以工作很多次。
}
当应用程序挂起时,它调用保存状态方法:

protected async override void SaveState(字典页面状态)
{
pageState[“MediaElementSource”]=this.DefaultViewModel.CurrentSource;
//我还使视频流全球化,这样我可以处理它-但没有骰子。
这个.videoStream.Dispose();
this.videoStream=null;
}
当应用程序恢复时,它会调用LoadState方法:

protected async override void LoadState(对象导航参数,字典页面状态)
{
string source=string.Empty;
if(pageState!=null)
{
if(pageState.ContainsKey(“MediaElementSource”))
{
source=(字符串)页面状态[“MediaElementSource”];
}
}
var document=PublicationService.GetDocument(此.currentDocumentIdNumber);
this.DefaultViewModel=新文档ViewModel(文档);
this.DefaultViewModel.CurrentMarkerSourceChanged+=UpdateMediaElementSource;
如果(!string.IsNullOrEmpty(源))
{
//这将导致UpdateMediaElementSource()方法运行。
this.DefaultViewModel.CurrentSource=源;
}
}

我非常感谢在这个问题上的任何帮助。如果你需要更多的细节,请告诉我

因此,在将mediaElement添加到可视化树之前,它的源被设置好了

通常,在执行此操作时,这不是一个问题:

mediaElement.Source = whatever;
但当你这样做时,这是一个问题:

mediaElement.SetSource(stream, MimeType);
结论 在调用SetSource(…)时,请确保MediaElement是VisualTree的一部分

让我的上述代码正常工作的一个简单方法是,在触发
mediaElement.Loaded
事件后,添加一个设置为true的全局bool。然后,在调用
SetSource()
的代码中,将其包装在
if(_mediaElementLoaded)
块中