奇数文件关联处理错误

时间:2012-10-20 17:00:40

标签: c# .net vb.net xaml windows-runtime

我在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文件,它会在没有任何问题的情况下播放,直到我关闭应用程序。
  4. 因此,这种解决方法有时会起作用:

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

    有没有人知道为什么没有解决方法就无法正常工作?

1 个答案:

答案 0 :(得分: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在准备好之前需要发生什么。