(注: すべてのコードは大幅に簡略化されています。 )
問題
Suspend/Resume 後に MediaElement ソースが設定されていません。ソースが設定されると、CurrentState はすぐに "Closed" に変わります。
MediaFailed イベントを処理しています — 発生しません。また、発生しない MediaOpened イベントも処理しています。
詳細
MediaElement のソースを更新する次のメソッドがあります。アプリが中断された後に再開しようとしない限り、これは非常にうまく機能します。
private async void UpdateMediaElementSource(object sender, EventArgs e)
{
var videoSource = this.DefaultViewModel.CurrentSource; // a string
var file = await StorageFile.GetFileFromPathAsync(videoSource);
var videoStream = await file.OpenAsync(FileAccessMode.Read);
this.videoMediaElement.SetSource(videoStream, file.ContentType);
// The above line works many times as long as the app is not trying to Resume.
}
アプリが中断されると、SaveStateメソッドが呼び出されます。
protected async override void SaveState(Dictionary<String, Object> pageState)
{
pageState["MediaElementSource"] = this.DefaultViewModel.CurrentSource;
// I also made the videoStream global so I can dispose it — but no dice.
this.videoStream.Dispose();
this.videoStream = null;
}
アプリが再開すると、LoadStateメソッドが呼び出されます。
protected async override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
string source = string.Empty;
if (pageState != null)
{
if (pageState.ContainsKey("MediaElementSource"))
{
source = (string)pageState["MediaElementSource"];
}
}
var document = PublicationService.GetDocument(this.currentDocumentIdNumber);
this.DefaultViewModel = new DocumentViewModel(document);
this.DefaultViewModel.CurrentMarkerSourceChanged += UpdateMediaElementSource;
if (!string.IsNullOrEmpty(source))
{
// This causes the UpdateMediaElementSource() method to run.
this.DefaultViewModel.CurrentSource = source;
}
}
この問題について何か助けていただければ幸いです。詳細が必要な場合はお知らせください。