4

(注: すべてのコードは大幅に簡略化されています。 )

問題

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;
     }
  }

この問題について何か助けていただければ幸いです。詳細が必要な場合はお知らせください。

4

1 に答える 1

3

したがって、mediaElement の Source は、ビジュアル ツリーに追加される前に設定されていたことがわかります。

通常、これを行う場合、これは問題になりません。

mediaElement.Source = whatever;

ただし、これを行うと問題になります。

mediaElement.SetSource(stream, MimeType);

結論

SetSource(...) を呼び出すときは、MediaElement が VisualTree の一部であることを確認してください。

上記のコードを機能させる簡単な方法は、イベントが発生したときにtrueに設定されるグローバル bool を追加することです。mediaElement.Loaded次に、 を呼び出すコード内で、それSetSource()をブロックでラップしif(_mediaElementLoaded)ます。

于 2013-10-16T19:58:21.537 に答える