1

私はこれを持っていますApp.xaml.cs

protected override void OnFileActivated(FileActivatedEventArgs args)
{
    Window.Current.Content = new Frame();
    ((Frame)Window.Current.Content).Navigate(typeof(MainPage), args);
    Window.Current.Activate();
}

これはMainPage.xaml.cs:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    FileActivatedEventArgs filesArgs = (FileActivatedEventArgs)e.Parameter;
    StorageFile file = (StorageFile)filesArgs.Files[0];
    mc.SetSource(await file.OpenReadAsync(), file.ContentType);
    mc.Play();
}

そしてこれでMainPage.xaml

<MediaElement x:Name="mc" />

今、私は非常に奇妙な問題に直面しています。アプリを .MP4 ファイルに関連付けました。ファイルを開くたびに、すぐに再生されません。たとえば。

  1. 開いa.mp4ても再生されず、アプリを閉じません。
  2. 開いb.mp4ても再生されず、アプリを閉じません。
  3. 次に、開くa.mp4と再生されます。そうでない場合は、もう一度試して再生します。MP4 ファイルを開くと、アプリを閉じるまで問題なく再生されます。

したがって、この回避策は時々機能します。

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    FileActivatedEventArgs filesArgs = (FileActivatedEventArgs)e.Parameter;
    StorageFile file = (StorageFile)filesArgs.Files[0];
    StorageFile file2 = (StorageFile)filesArgs.Files[0];
    mc.SetSource(await file2.OpenReadAsync(), file2.ContentType);
    mc.SetSource(await file2.OpenReadAsync(), file2.ContentType);
    mc.Play();
}

回避策なしで機能しない理由を誰かが知っていますか?

4

1 に答える 1

1

ソースを設定して、コントロールが初期化または完全に読み込まれる前に再生を開始すると、ファイルが再生されないように見えます。これが、アプリが既に読み込まれている場合や、場合によっては最初の呼び出しでさえ、後続の呼び出しで機能する理由です。私は単純なアプリを作成し、ほとんどの試行で問題を再現することができました (ただし、うまくいくこともありました)。

プレイを開始する前に がロードされるのを常に待つという簡単な回避策を試してみましたMediaElementが、問題がなくなったようです。数十回の呼び出しで再現できませんでした。

これが私がやったことです:

MainPage.xaml:

<MediaElement x:Name="mc" Loaded="mc_Loaded" />

MainPage.xaml.cs

bool loaded = false;
Task task = new Task(() => {});

private void mc_Loaded(object sender, RoutedEventArgs e)
{
    loaded = true;
    task.Start();
}

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    FileActivatedEventArgs filesArgs = (FileActivatedEventArgs)e.Parameter;
    StorageFile file = (StorageFile)filesArgs.Files[0];
    if (!loaded)
        await task;
    mc.SetSource(await file.OpenReadAsync(), file.ContentType);
    mc.Play();
}

推測と経験的テストにのみ基づいているため、私のソリューションはあまり好きではありませんが、MediaElement準備が整う前に何が起こる必要があるかを示すドキュメントは見つかりませんでした。

于 2012-10-20T19:10:55.483 に答える